Невозможно обработать 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'))

Но возникает та же ошибка. Извините за длинноту и за вашу снисходительность ко всем ошибкам. И заранее спасибо за любую помощь, которую вы могли бы мне оказать.

Вернуться на верх