Как передать значение из представления в ModelForm - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь получить идентификатор для фильтрации элементов, чтобы показать. После нескольких уроков и документов я до сих пор не понимаю ...

Возможно ли это сделать?

Вот форма:

class MakeChecklistDone(forms.ModelForm):
    def __init__(self, task, *args, **kwargs):
        super(MakeChecklistDone, self).__init__(*args, **kwargs)

    #title = forms.CharField(max_length = 32)
    choices = forms.ModelMultipleChoiceField(
                    widget = forms.CheckboxSelectMultiple(), 
                    queryset=CheckUpList.objects.all().filter(done=False, task=???)
                    )
    class Meta:
        model = CheckUpList
        fields = ['choices', ]

I Я использую вид ниже:

def task_detail(request, pk):
    template_name = 'task/task-detail.html'
    task = Task.objects.get(pk=pk)
    ...
    if request.method == 'POST':
    ...
    else:
    form_checkUpList = MakeChecklistDone(request.POST, initial={'task': 11 })

Но, похоже, я делаю что-то не так ... Любая помощь будет изумительной.

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Вместо использования функции представления с использованием класса представления (создание представления, обновление представления, перечисление v) и использование метода get_form_kwargs для передачи значения в форму, как показано ниже:

class task_detail(LoginRequiredMixin,
                     UpdateView):
    template_name = 'learningcenters/lc/form.html'
    form_class = LearningCenterForm
    queryset = CheckUpList.objects.all()

    def get_object(self):
        id_ = self.kwargs.get("pk")
        return get_object_or_404(task_detail, id=id_)


    def get_form_kwargs(self, *args, **kwargs):
        kwargs = super().get_form_kwargs(*args, **kwargs)
        kwargs['task'] = 11
        return kwargs

В форме в init:

    def __init__(self, task, *args, **kwargs):
        super(MakeChecklistDone, self).__init__(*args, **kwargs)
        choices = forms.ModelMultipleChoiceField(
                    widget = forms.CheckboxSelectMultiple(), 
                    queryset=CheckUpList.objects.all().filter(done=False, task=task)
                    )
0 голосов
/ 26 апреля 2020

хорошо, спасибо, Сальма. Я сделал путаницу между "CBV" и "Функция просмотра".

def task_detail(request, pk):
    template_name = 'task/task-detail.html'
    task = Task.objects.get(pk=pk)
    ..
    if request.method == 'POST':
    ...
    else:
    form_checkUpList = MakeChecklistDone(task=task, request.POST)

Для формы:

class MakeChecklistDone(forms.ModelForm):
    choices = forms.ModelMultipleChoiceField(widget = forms.CheckboxSelectMultiple(), queryset=None)
    class Meta:
        model = CheckUpList
        fields = ['choices', ]

    def __init__(self, task, *args, **kwargs):
        super(MakeChecklistDone, self).__init__(*args, **kwargs)
        self.fields['choices'].queryset = CheckUpList.objects.all().filter(done=False, task=task))
...