Невозможно обработать Crispy Forms с помощью помощника с ModelForm и базовым представлением (UpdateView)
Я знаю, как отобразить и успешно использовать форму с помощью Crispy, независимо от типа представления, но только с помощью templates.html (не forms.py). Но поскольку все мои формы были вертикальными, я искал способ их кастомизации. Например, чтобы можно было отобразить 3 флажка или других поля в одной строке. Я потратил несколько дней, пытаясь сделать это с помощью собственных классов форм Django, но не смог добиться желаемого с помощью CSS. Я также долго пытался сделать это с помощью Crispy и Helper, которые кажутся мне самым простым способом, но это все еще не работает. Безуспешно. Я заблокирован в самом начале моего теста, особенно потому, что мне приходится работать с параметром / URL. Что бы я ни пытался сделать, возникает бесконечная ошибка : init() got an unexpected keyword argument 'pk'
forms.py, строка 9, in init --> super(SupplierDetailForm, self).init(*args, **kwargs) Если я удалю этот конструктор, то та же самая ошибка возникает глубоко в Django -> site-packages/django/core/handlers/base.py, строка 181, in _get_response
Первый вопрос : во время всех моих поисков я видел, что используемая модель или поля были объявлены либо в классе VIEW, либо в классе FORM в его META. Какой метод я должен использовать? 2-й вопрос : я не понимаю, как настроить форму с помощью помощника ModeForm (не просто Form), учитывая, что мы должны обязательно объявить fin view поля, используемые в форме, иначе это приведет к ошибке. Для чего нужно создавать пользовательскую форму, как в моем последнем примере ниже.
Вот мои части кода
URLS.PY (хорошо работает с HTML шаблоном)
path('supplier/<int:pk>/', views.SupplierDetailView.as_view(),
name='supplier-detail'),
MODELS.PY
class Supplier(models.Model):
nom = models.CharField(max_length=50)
tel = models.CharField(max_length=15, blank=True, default=None)
email = models.EmailField(blank=True, default=None)
adr1 = models.CharField(max_length=100, blank=True, default=None)
adr2 = models.CharField(max_length=100, blank=True, default=None)
cp = models.CharField(max_length=15, blank=True, default=None)
ville = models.CharField(max_length=50, blank=True, default=None)
pays = models.CharField(max_length=50, blank=True, default=None)
contact = models.CharField(max_length=50, blank=True, default=None)
date_crea = models.DateTimeField(default=timezone.now)
def __str__(self):
self.nom
return self.nom
def get_absolute_url(self):
return reverse("liste-suppliers")
VIEWS.PY
class SupplierUpdateView(LoginRequiredMixin, UpdateView):
form = SupplierDetailForm()
# model = Supplier
# fields = ['nom', 'tel', 'email', 'adr1',
# 'adr2', 'cp', 'ville', 'pays', 'contact']
template_name = 'suppliers/supplier_form.html'
def form_valid(self, form):
nom = form.instance.nom
messages.success(
self.request, f'Le Fournisseur {nom} a été mis à jour avec succès !')
return super().form_valid(form)
Я также пробовал это в VIEWS
def SupplierUpdateView(request):
if request.method == 'POST':
form = SupplierDetailForm(request.POST)
if form.is_valid:
form.save()
supplier_name = form.cleaned_data.get('nom')
messages.success(
request, f'Le fournisseur {supplier_name} a été mis à jour')
return redirect('/')
else:
form = SupplierDetailForm(request.POST)
context = {'form': form}
return render(request, 'suppliers/supplier_form.html', context)
CURRENT FORMS.PY
class SupplierDetailForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(SupplierDetailForm, self).__init__(*args, **kwargs)
self.helper = FormHelper(self)
#just for a try
self.helper.form_class = 'my-super-css'
class Meta:
model = Supplier
fields = ['nom', 'tel', 'email', 'adr1',
'adr2', 'cp', 'ville', 'pays', 'contact']
Следующие примеры найдены на https://django-crispy-forms.readthedocs.io/ я также пробовал (сначала) без успеха
FORMS.PY
class SupplierDetailForm(forms.Form):
id = forms.IntegerField()
nom = forms.CharField(
max_length=50,
required=True
)
tel = forms.CharField(
max_length=50,
required=False
)
email = forms.EmailField(
required=False
)
adr1 = forms.CharField(
max_length=100,
required=False
)
adr2 = forms.CharField(
max_length=100,
required=False
)
cp = forms.CharField(
max_length=10,
required=False
)
ville = forms.CharField(
max_length=50,
required=False
)
contact = forms.CharField(
max_length=50,
required=False
)
class Meta:
model = Supplier
fields = ['nom', ]
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.form_class = 'my-super-css'
self.helper.add_input(Submit('submit', 'Submit'))
Но возникает та же ошибка. Извините за длинноту и за вашу снисходительность ко всем ошибкам. И заранее спасибо за любую помощь, которую вы могли бы мне оказать.