django保存表单 - 覆盖旧行

Posted

技术标签:

【中文标题】django保存表单 - 覆盖旧行【英文标题】:django save form - overwrite old row 【发布时间】:2016-03-17 03:54:52 【问题描述】:

我有一个向我的数据库添加新数据的表单,但是这个表单会覆盖我表中的现有数据。我想添加一个新元组并将旧元组保留在我的数据库表中

forms.py

class StudentForm(forms.ModelForm):
    class Meta:
        model = student
        fields = ('First_Name', 'Last_Name', 'Birthday', 'Phone', 'Mobile', 'STNO',
          'Father_Name', 'Father_Job', 'Father_Phone', 'ID_Code',
          'National_ID', 'Address', 'Study_Field', 'Probation')

views.py

def add_student(request):
    if request.method == "POST":
        form = StudentForm(request.POST)
        if form.is_valid():
            new_student = form.save(commit=True)
            new_student.author = request.user
            new_student.save()
            return redirect('../')
    else:
        form = StudentForm()
    return render(request, 'school_manager/students/new_student.html', 'form': form)

models.py

class student(models.Model):
    id = models.IntegerField(default=1,null=False,primary_key=True)
    First_Name = models.CharField("First Name ", max_length=100,null=True)
    Last_Name = models.CharField("Last Name ",max_length=100,null=True)
    Birthday = models.CharField("Birthday ",max_length=10,null=True)
    Phone = models.CharField("Phone ",max_length=20,null=True)
    Mobile = models.CharField("Mobile ",max_length=20,null=True)
    STNO = models.CharField("STNO ",max_length=10,null=True)
    Father_Name = models.CharField("Father Name ",max_length=100,null=True)
    Father_Job = models.CharField("Father Job ",max_length=100,null=True)
    Father_Phone = models.CharField("Father Phone ",max_length=20,null=True)
    ID_Code = models.CharField("ID Code ",max_length=10,null=True)
    National_ID = models.CharField("National ID ",max_length=10,null=True)
    Address = models.CharField("Address ",max_length=200,null=True)
    Study_Field = models.CharField("Study Field ",max_length=100,null=True)
    Probation = models.BooleanField("Probation ",default=True)
    def __STR__ (self):
        return self.STNO

【问题讨论】:

什么表?你的意思是你不想更新new_student 而是创建一个新的? 数据库表.....是的,我想创建,但此代码更新现有行@Sayse 请同时显示您的student 型号。 How do I clone a Django model instance object and save it to the database?的可能重复 我只想添加一个新的表格行:(。例如一个博客.....每次点击“添加”按钮时添加一个带有标题和内容的新帖子@Sayse 【参考方案1】:

模型相关。看这个:

class student(models.Model):
    id = models.IntegerField(default=1,null=False,primary_key=True)

你总是在创建学号1

您应该为每个学生手动设置一个新的id

def add_student(request):
    if request.method == "POST":
        form = StudentForm(request.POST)
        if form.is_valid():
            new_student = form.save(commit=False)
            id = a_function_to_take_another_id_for_a_student()
            new_student.id = id
            new_student = form.save(commit=True)
            new_student.author = request.user

另一种方法是可以将类型id 更改为自动递增字段:

id = models.AutoField(primary_key=True)

【讨论】:

好点,我撤销我的评论..(模型不应该是相关的:P)【参考方案2】:

问题出在您的模型中。您已明确设置 ID 字段,如下所示:

    id = models.IntegerField(default=1,null=False,primary_key=True)

但你没有设置它的形式。这样 django 每次都会创建 ID = 1 的行(因为这是默认值)。

当您使用数据库中已存在的 ID 创建字段时,django 将更新现有字段,因为它无法创建新字段(不能有多个具有相同主键的字段)。

您应该将 ID 类型更改为 AutoField 或删除它的定义,然后 django 将创建默认 ID 字段,该字段将是 AutoField

【讨论】:

我过去曾使用“default=1”解决一些问题,但我忘记删除它了....谢谢...问题已解决 @ArashHatami,你知道怎么说谢谢:vote up their post ! Every upvote is an implicit "thank you".

以上是关于django保存表单 - 覆盖旧行的主要内容,如果未能解决你的问题,请参考以下文章

Django - 覆盖管理站点的登录表单

覆盖 django-allauth 表单域

Django 覆盖表单 HTML 标签模板?

Django如何覆盖默认表单错误消息

覆盖 Django 表单字段的名称 attr

Django 基于类的视图:覆盖表单名称