社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

在django数据库中插入foregin键

Mihael Waschl • 6 年前 • 1706 次点击  

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

查看:

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)

PYS:

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__')

模型:

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)

如果你能帮我解决这个问题,我会很高兴的。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/30347
 
1706 次点击  
文章 [ 2 ]  |  最新文章 6 年前
Debendra
Reply   •   1 楼
Debendra    6 年前

我在上面的注释中指定了,您有3个字段 forms.py 4个字段 models.py 你指定了所有 fields 在字段上使用 表单 .

变化 表单 .

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的回答。

Daniel Roseman
Reply   •   2 楼
Daniel Roseman    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)