Вставить исходный ключ в базу данных django

#python #django #database #postgresql

#python #django #База данных #postgresql

Вопрос:

Я создаю приложение django, в котором пользователь выбирает компанию, а затем приложение передает первичный ключ компании по URL. Пользователь перенаправляется на страницу, где он может видеть все устройства компании, и он может добавить новое в список. Теперь у меня проблема. Когда я отправляю форму со всеми данными, я всегда получаю одну и ту же ошибку проверки, которая сообщает мне, что поле company является обязательным (я добавил ключ foregin в форму перед проверкой). Что я делаю не так?

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)
  

Я был бы очень рад, если вы сможете помочь мне с этой проблемой.

Комментарии:

1. У вас есть 3 filefields на forms.py и 4 поля на models.py , и вы указали все поля для использования на fields на forms.py.

Ответ №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:

Я указал в комментариях выше, что у вас есть 3 поля на forms.py и 4 поля на models.py , и вы указали все 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
  

Вы также можете исключить поля, exclude = ('fields') согласно ответу @Daniel Roseman.