使用Django Forms编辑一行

时间:2016-07-26 06:41:55

标签: python django django-models django-forms

我想使用Django表单在Django 1.9中编辑一行:

所以我做的是

对于get请求,我初始化了表单实例(views.py)

def get(self, request):
    myModel = model.myModel.objects.get(user=request.user)
    form_instance = MyForm(initial=myModel.__dict__)
    return render(request, 'mytemplate.html', {'form': form_instance} )

def post(self, request):
    form_instance = MyForm(request.POST)
    if form_instance.is_valid():
        form_instance.save()
        return redirect('..')
    return render(request, 'mytemplate.html', {'form': form_instance} )

这是我的models.py

class MyModel(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    Booth = models.OneToOneField(BoothLocation)
class BoothLocation(models.Model):
    LocationID = models.CharField(max_length = 25)

我有一个forms.py

class MyForm(forms.ModelForm):
    class Meta:
        model = MyModel
        fields = ('Booth')
        labels = {'Booth':_('Booth Chosen')}

我的问题是我的模型有一对一的字段,因此每当我执行

form_instance = MyForm(request.POST)

它将返回一个错误,指出onetoonefield必须是唯一的,但我只是更新它。有没有办法覆盖这个验证?

顺便说一句,这个领域真的需要一对一。

1 个答案:

答案 0 :(得分:0)

这样做有点错误

form_instance = MyForm(initial=myModel.__dict__)

应该是

form_instance = MyForm(instance=myModel)

糟糕,忘了添加,为了处理表单验证失败的情况,你的帖子会遇到类似这样的事情:

form_instance = MyForm(request.POST, instance=myModel)

您需要再次获取实例。作为旁注,通过将两个函数合并为一个并在其中添加if else

,可以大大简化代码
if request.method == 'POST':

else: