Django хрустящие поля формы не сохраняются - PullRequest
0 голосов
/ 29 февраля 2020

Я пытаюсь отформатировать с Django хрустящими формами, но сохранить его невозможно.

первый код:

forms.py

class CreateForm_test(forms.Form): 
    name = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Name'}))
    street = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Street'}))
    number = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Number'}))
    comment = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Comment'}))
    phone = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Phone'}))
    status = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Status'}))





class CrispyAddressForm(CreateForm_test):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.layout = Layout(
            Row(
                Column('name', css_class='form-group col-md-6 mb-0'),
                css_class='form-row'
            ),
            'street',
            'number',
            Row(
                Column('comment', css_class='form-group col-md-6 mb-0'),

                Column('phone', css_class='form-group col-md-2 mb-0'),
                Column('status', css_class='form-group col-md-2 mb-0'),


                css_class='form-row'
            ),

            Submit('submit', 'Submit')
        )

просмотры. py

class CreateRegisterView(CreateView): 
    model = Register
    message = _("saved")
    form_class = CrispyAddressForm

    template_name = 'register_form.html'
    def form_valid(self, form):
        if self.request.user.is_authenticated:
            form.instance.user = self.request.user
        return super().form_valid(form)

    def get_success_url(self):
        messages.success(self.request, self.message)
        return reverse('home')

register_form. html

{% extends 'base.html' %}

{% load crispy_forms_tags %}

{% block content %}
  {% crispy form %}
{% endblock %}

Когда я открываю форму в своем браузере, я получаю эту ошибку

forms.py", line 36, in __init__
    super().__init__(*args, **kwargs)
TypeError: __init__() got an unexpected keyword argument 'instance'
[29/Feb/2020 18:40:13] "GET /Register/create/ HTTP/1.1" 500 115893

Я пытался также с класс CreateRegisterView (FormView): но тогда я получаю ту же ошибку для представлений в этой строке form.instance.user = self.request.user

Ответы [ 2 ]

0 голосов
/ 01 марта 2020

Я думаю, главная проблема в том, что я определил поля дважды. Один раз в моделях и один раз в моих формах.

Теперь это работает: формы

class CreateForm_test(forms.ModelForm):
    class Meta:
        model = Register
        fields = ['name', 'street', 'number', 'comment', 'phone', 'status']



class CrispyAddressForm(CreateForm_test):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.layout = Layout(
             Row(
                 Column('name', css_class='form-group col-md-7 mb-0'),
                css_class='form-row'
            ),
            Row(
                Column('street', css_class='form-group col-md-6 mb-0'),
                Column('number', css_class='form-group col-md-1 mb-0'),
                css_class='form-row'
            ),

            Row(
                Column('comment', css_class='form-group col-md-6 mb-0'),
                css_class='form-row'
            ),
            Row(
                Column('phone', css_class='form-group col-md-6 mb-0'),
                css_class='form-row'
            ),
            Submit('submit', 'Submit')
        )

просмотров

class CreateRegisterView(CreateView):
    model = Register
    message = _("saved")
    form_class = CreateForm
    template_name = 'register_form.html'
    def form_valid(self, form):
        if self.request.user.is_authenticated:
            form.instance.user = self.request.user
        return super().form_valid(form)

    def get_success_url(self):
        messages.success(self.request, self.message)
        return reverse('home')

моделей

class Register(models.Model):
    CREATED = "C"
    DELETED = "D"
    STATUS = (
        (CREATED, _("Created")),
        (DELETED, _("Deleted")),
    )
    user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, related_name="author", on_delete=models.SET_NULL, default=1)
    timestamp = models.DateTimeField(auto_now=True)
    created_at = models.DateTimeField(default=datetime.now)
    status = models.CharField(max_length=1, choices=STATUS, default=CREATED)
    comment = models.CharField(max_length=42, null=True, unique=False, blank=True)
    edited = models.BooleanField(default=False)
    objects = ArticleQuerySet.as_manager()
    name = models.CharField(max_length=35, null=True, unique=False)
    street = models.CharField(max_length=42, null=True, unique=False, blank=True)
    number = models.CharField(blank=True, null=True, max_length=6)
    phone = models.CharField(max_length=15, blank=True, null=True)
    zip = models.CharField(max_length=42, null=True, unique=False, blank=True)
    city = models.CharField(max_length=42, null=True, unique=False, blank=True)
    class Meta:
        verbose_name = _("Register")
        verbose_name_plural = _("Register")
        ordering = ("-timestamp",)

    def __str__(self):
        return self.name

    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)

html

{% extends 'base.html' %}

{% load crispy_forms_tags %}

{% block content %}
  {% crispy form %}
{% endblock %}

Чтобы понять, с крипсиформой у меня есть два варианта форматирования формы. Первый это с формами, а второй прямой в html.

Когда я изменяю в представлениях на form_class = CreateForm_test и в html

{% extends 'base.html' %}

{% load crispy_forms_tags %}

{% block content %}
  <form method="post" novalidate>
    {% csrf_token %}
    <div class="form-row">
      <div class="form-group col-md-6 mb-0">
        {{ form.name|as_crispy_field }}
      </div>
    </div>
    <button type="submit" class="btn btn-primary">Submit</button>
  </form>
{% endblock %}

Тогда больше не работает , первый пример форматирования в формах работает. Во втором html я добавил только поле name, потому что только это обязательное поле.

в чем разница, что html -форматирует не работает? Форма видна в браузере, но не сохраняется, ошибок нет.

0 голосов
/ 29 февраля 2020

Проблема в том, что вы использовали Form, , а не a ModelForm. Простой Form не имеет .instance и ничего не знает о .save(), поскольку задачей Form является просто обработка данных GET или POST, а также проверка и очистка. ModelForm, построенный поверх Form, может загружать, обновлять и сохранять объекты модели. Таким образом, вы должны создать подкласс из ModelForm и предоставить Meta:

class CreateForm_test(forms.<b>ModelForm</b>): 
    name = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Name'}))
    street = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Street'}))
    number = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Number'}))
    comment = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Comment'}))
    phone = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Phone'}))
    status = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Status'})

    class <b>Meta</b>:
        model = Register
        fields = ['name', 'street', 'number', 'comment', 'phone', 'status']

Кроме того, как указано в документации , вам необходимо указать действие в помощнике:

class CrispyAddressForm(CreateForm_test):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.helper = FormHelper()
        <b>self.helper.form_action = <i>'name_of_createview'</i></b>
        self.helper.layout = Layout(
            Row(
                Column('name', css_class='form-group col-md-6 mb-0'),
                css_class='form-row'
            ),
            'street',
            'number',
            Row(
                Column('comment', css_class='form-group col-md-6 mb-0'),

                Column('phone', css_class='form-group col-md-2 mb-0'),
                Column('status', css_class='form-group col-md-2 mb-0'),


                css_class='form-row'
            ),

            Submit('submit', 'Submit')
        )
...