#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.