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保存表单 - 覆盖旧行的主要内容,如果未能解决你的问题,请参考以下文章