我知道save()方法决定是否应该插入或更新,具体取决于主键是否已存在于数据库中。
我使用charField作为主键。 我的问题是,当我尝试提交表单时,它会给出一个错误,指出数据库中已经有一个包含该主键的元素,这就是我正在测试但它应该更新该行而不是仅仅抛出错误。所以错误发生在is_valid但我不知道如何通过这个。因为如果我只是把它拿出来然后它会给出一个错误,说明数据没有经过验证。
views.py
def sxsw(request):
if request.method == 'POST':
form = SXSWForm(request.POST)
if form.is_valid() :
form.save()
return redirect('/sxsw/formSubmitted/')
else:
print form.errors
else:
form = SXSWForm()
return render(request, 'sxsw/sxsw.html', {'form': form})
models.py
class SXSWDemo(models.Model):
SIMULATIONS = (
('ABC', 'ABC'), ('Asterix', 'Asterix'), ('Home', 'Home'),
)
PET = (
('Dog', 'Dog'),('Cat', 'Cat'), ('Fish','Fish'),('Hamster', 'Hamster'),
)
COLOR = (
('Red', 'Red'), ('Blue', 'Blue'), ('Green', 'Green'), ('Purple', 'Purple'), ('Black', 'Black'), ('White', 'White'),
)
firstAndLastName = models.CharField(max_length = 50, primary_key=True)
email = models.EmailField(null = True, blank = True)
simulation = models.CharField(max_length = 10, choices = SIMULATIONS)
favoritePet = models.CharField(max_length = 10, choices = PET)
favoriteColor = models.CharField(max_length = 10, choices = COLOR)
def __unicode__(self):
return self.firstName
非常感谢任何帮助
答案 0 :(得分:1)
您需要区分编辑视图和创建视图。目前,您的视图是创建视图和编辑视图的两倍。
此外,您似乎在ModelForm上调用save方法而不是模型实例上的save方法。有区别。
每个ModelForm也有一个save()方法。这个方法创建和 从绑定到表单的数据中保存数据库对象。的子类 ModelForm可以接受现有的模型实例作为关键字 论证实例;如果提供了这个,save()将更新它 实例。如果没有提供,save()将创建一个新实例 指定的模型:
https://docs.djangoproject.com/en/1.10/topics/forms/modelforms/#the-save-method
因此,您需要分解视图,或者需要告诉用户该实例已存在,并询问他是否要替换它。
请注意,使用ORM(特别是django ORM)时,最好使用自动增量数字主键。您的firstAndLastName
字段可以标记为唯一。
答案 1 :(得分:0)
我想通过使用在答案中链接的文档来解决它是如何工作的,尽管我必须使用主键“Dont Delete”在数据库中创建一个虚拟元素。然后我按照文件上的内容。
注意:SXSWDemo是Model,SXSWForm是该模型的表单。
if request.method == 'POST':
obj = SXSWDemo.objects.get(pk="Dont Delete")
form = SXSWForm(request.POST, instance=obj)
if form.is_valid:
form.save()
return redirect('/sxsw/formSubmitted/')
else:
print form.errors