Модель Django CreateView не отображает поля формы в HTML - PullRequest
0 голосов
/ 07 июля 2019

Я пытаюсь настроить класс CreateView для модели на моем сайте django, но когда создается страница html, поля модели не отображаются.Только кнопка отправки отображается на веб-странице.Однако при отладке я переопределил метод form_invalid в представлении класса, и у объекта формы был обязательный HTML-код для всех полей, хранящихся в объекте.Если я возьму этот HTML-код и вручную добавлю его в HTML-код страницы создания в браузере, я смогу заполнить поля и отправить данные в базу данных.

На данный момент я не нашел очевидного ответа, посколькупочему поля формы не отображаются, поэтому любая помощь по этому вопросу будет принята с благодарностью.

используемая среда: python 3.7.3, django 2.2.3


Решение:

Эта проблема была исправлена ​​путем изменения имени формы в данных контекста представления.

В views.py:


def get_context_data(self, *args, **kwargs):
        context = super(CreateAlertView, self).get_context_data(**kwargs)
        context["alert_form"]=context["form"]
        return context

Или ... ВШаблон HTML измените «alert_form» на «form», чтобы соответствовать контексту по умолчанию.


models.py:

class Alert(models.Model):
    RAIN = 'Rain'
    SNOW = 'Snow'
    COLD = 'Cold'
    HEAT = 'Heat'
    WEATHER_CHOICES = [
        (RAIN, 'Rain'),
        (SNOW, 'Snow'),
        (COLD, 'Cold'),
        (HEAT, 'Heat'),
    ]

    DAILY = 'Daily'
    WEEKLY = 'Weekly'
    INTERVAL_CHOICES = [
        (DAILY, 'Daily'),
        (WEEKLY, 'Weekly'),
    ]

    weather_type = models.CharField(max_length=15, choices=WEATHER_CHOICES, default=RAIN)
    interval = models.CharField(max_length=10, choices=INTERVAL_CHOICES, default=DAILY)
    search_length = models.IntegerField(default=1)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    active = models.BooleanField(default=False)

views.py:

class CreateAlertView(LoginRequiredMixin, CreateView):
    template_name = 'users/alert_form.html'
    #model = Alert
    form_class = AlertModelForm
    success_url = 'users/profile/'

    def form_valid(self, form):

        print('validation')
        form.instance.user = self.request.user
        return super().form_valid(form)

    def form_invalid(self, form):
        print(form) # check form HTML here
        return super().form_invalid(form)

forms.py:

class AlertModelForm(ModelForm):

    class Meta:
        model = Alert
        exclude = ['user']

urls.py:

urlpatterns = [
    path('alert/create/', CreateAlertView.as_view(), name='alert'),
]

HTML-шаблон:

<h1>create an alert</h1>
<form method="post">
    {% csrf_token %}
    {{ alert_form.as_p }}
    {{ alert_form.non_field_errors }}
    {{ field.errors }}
    <button type="submit">Save changes</button>
</form>

Создать страницу как обработанную:

Create page as rendered

Создание страницы с измененным вручную HTML: Create page with manually modified HTML

1 Ответ

1 голос
/ 07 июля 2019

Имя контекста для формы, установленной CreateView (FormMixin), равно «form», ваш шаблон ссылается на «alert_form»

Здесь - это полезный веб-сайт для просмотра всех доступных опцийв классовых представлениях

...