【问题标题】:Insert foregin key in django database在 django 数据库中插入外键
【发布时间】:2019-03-08 13:09:57
【问题描述】:

我正在构建 django 应用程序,其中用户选择一个公司,然后应用程序通过 url 传递公司主键。然后,用户将重定向到可以查看所有公司设备的页面,并且可以将新设备添加到列表中。现在我有问题。当我提交包含所有数据的表单时,我总是得到相同的验证错误,这告诉我公司字段是必需的(我在验证之前向表单添加了外键)。我做错了什么?

views.py:

def network_devices(request, pk=None):
    if pk:
        if request.method == 'POST':

            if 'dodajnapravo' in request.POST:
                devices_form = AddNetworkDevice(request.POST)
                devices_form.company = pk
                if devices_form.is_valid():
                    devices_form.save()
                    return redirect(network_devices)

                else:
                    messages.error(request, 'Vnešeni podatki niso pravilni!')
                    return redirect(network_devices)

        elif request.method == 'GET':
            devices_form = AddNetworkDevice()
            devices = NetworkDevices.objects.filter(company_id=pk).all()
            print(devices)
            return render(request, 'interface/network_devices.html', {'device_form': devices_form, 'page_title': 'Naprave',
                                                                  'devices': devices})

    else:
         return redirect(add_select_company)

forms.py:

class AddNetworkDevice(forms.ModelForm):
     vendor = forms.CharField(required=True, label='Proizvajalec', max_length=100)
     product = forms.CharField(required=True, label='Produkt', max_length=100)
     version = forms.CharField(required=False, label='Verzija', max_length=50)

    class Meta:
         model = NetworkDevices
         fields = ('__all__')

models.py:

class Company(models.Model):
    class Meta:
        verbose_name_plural = 'Podjetja'

    company_name = models.CharField(max_length=150)
    company_addres = models.CharField(max_length=500)

    def __str__(self):
        return str('{}').format(self.company_name)


class NetworkDevices(models.Model):
    class Meta:
        verbose_name_plural = 'Naprave v Omrežju'

    company = models.ForeignKey(Company, on_delete=models.CASCADE)
    vendor = models.CharField(max_length=100)
    product = models.CharField(max_length=100)
    version = models.CharField(max_length=50)

如果您能帮我解决这个问题,我将非常高兴。

【问题讨论】:

  • 您在 forms.py 上有 3 个 fileld,在 models.py 上有 4 个字段,并且您在 forms.py. 上指定了要在 fields 上使用的所有字段

标签: python django database postgresql


【解决方案1】:

devices_form.company 没有做任何有用的事情。

如果你想手动设置一个值,你应该从表单域中完全排除它,并在保存时设置它。

class AddNetworkDevice(forms.ModelForm):
    ...
    class Meta:
        model = NetworkDevices
        exclude = ('company',)

...

       if 'dodajnapravo' in request.POST:
            devices_form = AddNetworkDevice(request.POST)
            if devices_form.is_valid():
                device = devices_form.save(commit=False)
                device.company_id = pk
                device.save()
                return redirect(network_devices)

【讨论】:

    【解决方案2】:

    我在上面的 cmets 中指定,forms.py 上有 3 个字段,models.py 上有 4 个字段,并且您指定所有 fields 用于 forms.py 上的字段。

    更改forms.py

    class AddNetworkDevice(forms.ModelForm):
         vendor = forms.CharField(required=True, label='Proizvajalec', max_length=100)
         product = forms.CharField(required=True, label='Produkt', max_length=100)
         version = forms.CharField(required=False, label='Verzija', max_length=50)
    
        class Meta:
             model = NetworkDevices
             fields = ('vendor', 'product', 'version')  # here is your problem
    

    您还可以按照@Daniel Roseman 的回答排除exclude = ('fields') 的字段。

    【讨论】:

      猜你喜欢
      • 2020-12-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-12
      • 2019-01-31
      • 1970-01-01
      • 2013-12-17
      • 2013-11-03
      • 2011-06-07
      相关资源
      最近更新 更多