不保存数据Django Foreignkey模型

时间:2019-08-25 06:16:35

标签: python django django-models django-forms django-views

我有两个模特。我想保存来自ForeignKey模型的数据。我创建了一个模型表单并保存了我的主要外键模型。但是我遇到了这个错误ValueError at /c/customer/1/ Cannot assign "'1'": "BillingData.customer" must be a "CustomerData" instance.

我创建了Django模型表单并加入了视图。

models.py文件

class CustomerData(models.Model):
    customer_name = models.CharField(max_length=100)
    customer_no = models.CharField(max_length=100, default='', blank=True)
    mobile_number = models.IntegerField()
    alternative_phone = models.IntegerField(null=True, blank=True)
    union_name = models.ForeignKey(UnionName, on_delete=models.SET_NULL, null=True)
    word_name = models.ForeignKey(UnionWordName, on_delete=models.SET_NULL, null=True)
    full_address = models.CharField(max_length=200, null=True, blank=True)
    create_date = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    def __str__(self):
        return '%s, Mobile: %s' % (self.customer_name, self.mobile_number)

    def get_absolute_url(self):
        return reverse('customer_data', kwargs={'pk': self.pk})


class BillingData(models.Model):
    bill_no = models.CharField(max_length=100, default='', blank=True)

    customer = models.ForeignKey(CustomerData, on_delete=models.CASCADE)
    sales_person = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True)
    customer_money = models.IntegerField()
    create_date = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    def __str__(self):
        return '%s %s' % (self.customer.customer_name, self.create_date.date())

    def get_absolute_url(self):
        return reverse('customers.views.BillingPage', kwargs={'pk': self.pk})

forms.py文件

class BillCreateForms(forms.ModelForm):
    bill_no = forms.CharField(max_length=100)
    customer = forms.ChoiceField(choices=[(x.id, x.customer_name) for x in CustomerData.objects.all()])
    customer_money = forms.IntegerField()

    def save(self, commit=True):
        instance = super(BillCreateForms, self).save(commit=False)
        customer_pk = self.cleaned_data['customer']

        instance.customer = CustomerData.objects.get(pk=customer_pk)
        instance.save(commit)
        return instance

    class Meta:
        model = BillingData
        fields = ('bill_no', 'customer', 'customer_money',)

views.py文件

class CustomerDataView(FormMixin, generic.DetailView):
    model = CustomerData
    form_class = BillCreateForms
    template_name = "customers/customerdata_detail.html"
    print(form_class)

    success_url = '/c/'

    def post(self, request, *args, **kwargs):
        if not request.user.is_authenticated:
            return HttpResponseForbidden()
        form = self.get_form()
        if form.is_valid():
            return self.form_valid(form)
        else:
            return self.form_invalid(form)

我希望数据与外键关系数据一起保存。但不要在这里保存。

2 个答案:

答案 0 :(得分:1)

您无法在save方法中解决此问题,因为该错误会在此之前发生。

您应该使用ModelChoiceField,而不是ChoiceField。这样不仅可以解决问题,还可以让您删除整个保存方法。

customer = forms.ModelChoiceField(queryset=CustomerData.objects.all())

答案 1 :(得分:0)

更改此行

instance.customer = CustomerData.objects.get(pk=customer_pk)

instance.customer_id = CustomerData.objects.get(pk=customer_pk).pk