Получите недопустимые поля из формы Django

#django

Вопрос:

Допустим, у меня есть следующее мнение

 def add_list(request):
   user = request.user
   if request.method =="POST":
      instance = MyModel(user=user)
      form = MyForm(instance = instance)
      form.is_valid()  #False
 

есть ли способ выяснить, какие поля «неправильные» и почему?

Я попробовал form.errors , который вернулся {}

Комментарии:

1. Вы пытались form.non_field_errors увидеть ошибки, которые не связаны ни с какими полями?

2. @Nimdeveloper: если форма не ограничена (путем передачи данных), форма недействительна, поэтому все и .errors т. Д. пусты.

3. Это тоже Пусто

4. @WillemVanOnsem да, это имеет смысл.

Ответ №1:

A Form ( ModelForm или «простой» Form ) допустим только в том случае, если (1) он ограничен; и (2) если не возникает ошибок проверки. Форма ограничена, если в нее передаются данные (обычно это первый названный параметр data ).

Чтобы сделать форму ограниченной, вы, таким образом, должны передать что-то data=… параметру, это может быть пустой словарь или QueryDict что-то подобное request.POST .

Таким образом, мы можем, например, передать request.POST request.FILES ) в качестве первых (двух) параметров:

 def add_list(request):
   if request.method =='POST':
      instance = MyModel(user=user)
      form = MyForm(request.POST, request.FILES, instance=instance)
      if form.is_valid():
          # … (likely form.save())
          pass 

Комментарии:

1. Дело в том, request что содержит данные, предоставленные пользователем, которые должны быть преобразованы перед добавлением MyForm вместе с некоторыми другими данными (я опустил это по соображениям ясности), поэтому данные запроса фактически не имеют никакого отношения MyForm . Мне все еще нужен запрос. ПОСЛЕ этого?

2. @CutePoison: Форма действительна, если она ограничена и не содержит ошибок в полях. Форма ограничена , если вы передаете в нее данные, например request.POST , или request.GET (для поиска с запросом GET).

3. Тогда мне нужно будет связать его с моими преобразованными данными, тогда я предполагаю (анализ данных-дикт вместо запроса.POST) ?

4.@CutePoison: request.POST является QueryDict , таким образом, словарным объектом, но вы можете работать с другими словарными (похожими) объектами.

5. Не стесняйтесь добавлять к своему ответу, что форма должна быть привязана, иначе она не может быть действительной — тогда я приму ответ