Django Queryset в ModelForm, используя 'pk' - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь следовать этим SO Q & A, это именно то, что я хочу сделать, но с pk вместо фиксированного ключа.Мои файлы ...

views.py

class JuryCreate(CreateView):
    model = Jury
    form_class = JuryCreateForm

    def form_valid(self, form):
        form.instance.customer_id = self.kwargs['pk']
        form.instance.court_year_id = self.kwargs['yr']
        return super().form_valid(form)

forms.py

class JuryCreateForm(ModelForm):

    class Meta:
        model = Jury
        fields = [
            'parent_jury',
            #Other Fields
            ]

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['parent_jury'].queryset = Jury.objects.filter(
            customer_id = self.kwargs['pk']).filter(
            court_year_id = self.kwargs['yr'])

Если я перейду прямо из view к шаблону, явозможность доступа к набору запросов (он предоставляет объект набора запросов).Но если я пройду через ModelForm, он выдаст AttributeError: 'JuryCreateForm' object has no attribute 'kwargs'.По сути, я считаю, что запрос не передается в ModelForm, поэтому он не может получить доступ к kwargs.Как получить первичные ключи в ModelForm для заполнения полей?

Я также попробовал варианты метода get_form_kwargs, который, я думаю, является подходящим механизмом для передачи их в ModelForm - я просто могу 'заставить его реализовать правильно (или получить в нужном объекте класса).

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

И получение шаблона для работы

В качестве окончательного дополнения к правильному ответу @neverwalkaloner - после инициализации Queryset в ModelForm он отображается в шаблоне следующим образом (илипо крайней мере, самый быстрый способ, который я нашел):

jury-update.html

<select>
    {% for item in form.parent_jury.field.queryset %}
        <option value="{{item}}">{{ item }}</option>
    {% endfor %}
</select>
0 голосов
/ 05 июня 2018

Попробуйте переопределить метод get_form_kwargs представления следующим образом:

class JuryCreate(CreateView):
    model = Jury
    form_class = JuryCreateForm

    def form_valid(self, form):
        form.instance.customer_id = self.kwargs['pk']
        form.instance.court_year_id = self.kwargs['yr']
        return super().form_valid(form)

    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        kwargs['pk'] = self.kwargs['pk']
        kwargs['yr'] = self.kwargs['yr']
        return kwargs

В форме инициализации используйте kwargs['pk'] или kwargs.pop('pk') для доступа к pk значению:

def __init__(self, *args, **kwargs):
    pk = kwargs.pop('pk')
    yr = kwargs.pop('yr') 
    super().__init__(*args, **kwargs)
    self.fields['parent_jury'].queryset = Jury.objects.filter(
        customer_id = pk).filter(
        court_year_id = yr)
...