使用用户定义的主键Django更新数据库中的元素

时间:2017-03-09 03:46:03

标签: python django django-models

我知道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 

非常感谢任何帮助

2 个答案:

答案 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
相关问题