Я пытаюсь настроить класс 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>
Создать страницу как обработанную:
Создание страницы с измененным вручную HTML: