为了账号安全,请及时绑定邮箱和手机立即绑定

在 Django 数据库中插入外键

在 Django 数据库中插入外键

慕后森 2021-11-30 15:57:29
我正在构建 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)如果你能帮我解决这个问题,我会很高兴。
查看完整描述

2 回答

?
慕码人8056858

TA贡献1803条经验 获得超6个赞

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)


查看完整回答
反对 回复 2021-11-30
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

我在上面的评论中指定了,您有 3 个字段 onforms.py和 4 个字段,models.py并且您指定了 allfields用于 上的字段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

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


查看完整回答
反对 回复 2021-11-30
  • 2 回答
  • 0 关注
  • 214 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信