以Django形式保存默认值

时间:2019-07-29 20:23:51

标签: python django django-models django-forms

我有一个Django模板,其中我使用两种不同的形式:

views.py

def myview(request):

    if request.method == 'POST':

        form = TradingForm(request.POST)

        if form.is_valid():

            profile = form.save(commit=False)
            profile.user = request.user
            profile.save()
            messages.success(request, f"Success")


    # if a GET (or any other method) we'll create a blank form
    else:
        form = MyForm()


    context = {

        'first_form': FirstForm(request.POST or None),
        'second_form': SecondForm(request.POST or None),
    }

    return render(request, "main/template.html", context)

form.py

  class FirstForm(forms.ModelForm):

        rate = forms.CharField()
        amount = forms.FloatField()


        class Meta:
            model = MyModel
            fields = ("rate", "amount")

        def save(self, commit=True):
            send = super(MyForm, self).save(commit=False)
            if commit:
                send.save()
            return send


  class SecondForm(forms.ModelForm):

        rate = forms.CharField()
        amount = forms.FloatField()


        class Meta:
            model = MyModel
            fields = ("firstfield", "secondfield")

        def save(self, commit=True):
            send = super(MyForm, self).save(commit=False)
            if commit:
                send.save()
            return send

如您所见,这两个表单使用的是同一模型,但是它们具有不同的字段,因此用户将提交这些字段,并且数据将保存在我的数据库中:

class Trade(models.Model):
    amount = models.FloatField()
    rate = models.FloatField()
    formtype = models.CharField(max_length=20)
    user = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, null=True, editable=False)

    def save(self): # ALL the signature

        super(Trade, self).save()

用户提交字段amountrateuser字段不是由用户提交的,而是由Django保存的。第四个字段是formtype字段。此字段不得由用户提交,而是“自动”提交,就像保存字段user一样。

一个示例:如果用户在我的数据库中的formtype列下方使用了第一种形式,则我应该看到FirstForm,如果用户从第二种形式提交了数据,则应该相同。我不知道我要完成的目标是否明确,但是我想知道如何在Django中完成这一目标。每个建议都表示赞赏!

1 个答案:

答案 0 :(得分:1)

由于您已经覆盖了save,因此可以将其添加到该模型实例中:

   class FirstForm(forms.ModelForm):
        ...
        def save(self, commit=True):
            send = super(MyForm, self).save(commit=False)
            send.formtype = 'FirstForm'
            if commit:
                send.save()
            return send