Django: объект CreateView с полями динамической формы не сохранен - PullRequest
0 голосов
/ 21 ноября 2018

Я настроил рабочий CreateView.Однако, когда я сделал одно из моих полей формы модели ('erlaubte_pruefer') динамическим, объект больше не сохраняется.

Я перепробовал множество решений, предложенных в других публикациях, например - get переменная пользователя в get_form_kwargs (), - ограничивают выбор полей в get_form () вместо forms.py - не используйте CreateView

, но я просто могу 'заставить его работать.Я не получаю ошибку или исключение, форма отображается только снова.

Я был бы очень признателен за ваш вклад.Спасибо!

forms.py

class Checklisten_Reinigung_Form(forms.ModelForm):

    class Meta:
        model = Checklisten_Reinigung
        fields = ['okay',
              'raum_verbindung',
              'ausfuehrer',
              'erlaubte_pruefer'
              ]

    # user should only choose from those objects that were created by himself
    def __init__(self, user, *args, **kwargs):
        super(Checklisten_Reinigung_Form, self).__init__(*args, **kwargs)
        self.fields['erlaubte_pruefer'].queryset = 
                   Pruefer.objects.filter(firmenzugehoerigkeit=user)

views.py

class Checklisten_Reinigung_Create_View(LoginRequiredMixin, CreateView):
    template_name = 'checklisten/checklisten_form.html'

    def get_context_data(self, **kwargs):
        context = super(Checklisten_Reinigung_Create_View, 
                        self).get_context_data(**kwargs)
        context['mymodel'] = Checklisten_Reinigung()
        return context

    # if I leave out get_form() the object is successfully saved
    # but the user's choice is not limited

    def get_form(self, form_class=None):
        form = Checklisten_Reinigung_Form(user=self.request.user)
        return form

    def form_valid(self, form):
        self.object = form.save(commit=False)

        try:
            self.object.pruefende_firma = self.request.user
            self.object.bezeichnung = self.object.bezeichnung
            self.object.ausfuehrer = form.cleaned_data['ausfuehrer']
            self.object.erlaubte_pruefer = 
                  form.cleaned_data['erlaubte_pruefer']
            self.object.okay = form.cleaned_data['okay']
            self.object.raum_verbindung= form.cleaned_data['raum_verbindung']
            self.object.save()


            return HttpResponseRedirect(self.get_success_url())

        except:
            messages.error(self.request, 'Es ist ein Fehler aufgetreten.')
            return self.render_to_response(self.get_context_data(form=form(user=self.request.user)))

    def get_success_url(self):
        messages.success(self.request, 'Checkliste erfolgreich gespeichert.')
        return reverse('checkliste-startseite')

РЕДАКТИРОВАТЬ:

Спасибо,@ Даниэль Роземан за ваш ответ.Я включил ваш код в свой, но получил эту ошибку:

Traceback:

File "C:\Users\Mars\Anaconda3\lib\site-packages\django\core\handlers\exception.py" in inner
  34.             response = get_response(request)

File "C:\Users\Mars\Anaconda3\lib\site-packages\django\core\handlers\base.py" in _get_response
  126.                 response = self.process_exception_by_middleware(e, request)

File "C:\Users\Mars\Anaconda3\lib\site-packages\django\core\handlers\base.py" in _get_response
  124.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\Users\Mars\Anaconda3\lib\site-packages\django\views\generic\base.py" in view
  68.             return self.dispatch(request, *args, **kwargs)

File "C:\Users\Mars\Anaconda3\lib\site-packages\django\contrib\auth\mixins.py" in dispatch
  52.         return super().dispatch(request, *args, **kwargs)

File "C:\Users\Mars\Anaconda3\lib\site-packages\django\views\generic\base.py" in dispatch
  88.         return handler(request, *args, **kwargs)

File "C:\Users\Mars\Anaconda3\lib\site-packages\django\views\generic\edit.py" in get
  168.         return super().get(request, *args, **kwargs)

File "C:\Users\Mars\Anaconda3\lib\site-packages\django\views\generic\edit.py" in get
  133.         return self.render_to_response(self.get_context_data())

File "C:\Users\Mars\Desktop\morecooking_now\morecooking_now\checklisten\views.py" in get_context_data
  372.         context = super(Checklisten_Reinigung_Create_View, self).get_context_data(**kwargs)

File "C:\Users\Mars\Anaconda3\lib\site-packages\django\views\generic\edit.py" in get_context_data
  66.             kwargs['form'] = self.get_form()

File "C:\Users\Mars\Anaconda3\lib\site-packages\django\views\generic\edit.py" in get_form
  32.             form_class = self.get_form_class()

File "C:\Users\Mars\Anaconda3\lib\site-packages\django\views\generic\edit.py" in get_form_class
  93.                 model = self.get_queryset().model

File "C:\Users\Mars\Anaconda3\lib\site-packages\django\views\generic\detail.py" in get_queryset
  73.                         'cls': self.__class__.__name__

Exception Type: ImproperlyConfigured at /checklisten/reinigung/neu/
Exception Value: Checklisten_Reinigung_Create_View is missing a QuerySet. Define Checklisten_Reinigung_Create_View.model, Checklisten_Reinigung_Create_View.queryset, or override Checklisten_Reinigung_Create_View.get_queryset().

Еще раз спасибо!

1 Ответ

0 голосов
/ 21 ноября 2018

Вы изменили сигнатуру формы так, что первый позиционный аргумент теперь user, а не data.Но вы определили get_form, чтобы только когда-либо проходить user, и никогда data;поэтому форма никогда не получает никаких данных и поэтому не может быть действительной.

Вместо этого сделайте пользователя kwarg:

def __init__(self, *args, **kwargs):   # no user here
    user = kwargs.pop('user', None)
    super(Checklisten_Reinigung_Form, self).__init__(*args, **kwargs)
    self.fields['erlaubte_pruefer'].queryset = 
               Pruefer.objects.filter(firmenzugehoerigkeit=user)

и в представлении удалите определение get_form и вместо этого определитеget_form_kwargs чтобы передать пользователя:

def get_form_kwargs(self):
    kwargs = super().get_form_kwargs()
    kwargs['user'] = self.request.user
    return kwargs

Обратите внимание, что вы делаете слишком много работы в form_valid;вызов form.save уже установит поля в форме, такие как "erlaubte_pruefer" и "okay", поэтому вам не нужно устанавливать их вручную.

(И, наконец, это абсолютнобесполезно слепо отлавливать все ошибки и просто возвращать расплывчатое сообщение «ошибка произошла». Оно скрывает ведение журнала, которое сообщит вам о случившемся, и не даст пользователю никакой полезной информации. Улавливайте только те ошибки, которые вы знаетевы будете иметь дело, удалите эту попытку / исключение и позвольте Django показать страницу ошибки по умолчанию.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...