Как отфильтровать модель Django для отображения данных только вошедшего пользователя?

Пытаюсь решить эту проблему уже неделю. Как мне отфильтровать мою модель, чтобы отобразить только данные, назначенные конкретному вошедшему пользователю? Мой код views.py ниже не работает - он не говорит forms.py, что ему нужно сделать для этого. Я получаю ошибку 'ForwardManyToOneDescriptor' object has no attribute 'option1'.

Это эффективно фильтрует в шаблоне - но мне нужно использовать виджет RadioSelect (определенный в forms.py), чтобы отобразить конкретные варианты, из которых должен выбрать конкретный зарегистрированный пользователь (и я не думаю, что я могу - или должен - закодировать это в шаблоне).

views.py

class VoteView(LoginRequiredMixin, CreateView):
    model = Result
    form_class = VotingForm
    template_name = 'users/vote_form.html'

 *Attempt #1:
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['Result'] = Result.objects.all()
        context['user_specific'] = 
                          Result.objects.filter
                          (custom_user=self.request.user)
        return context

 *Attempt #2:
    def get_initial(self):
        initial = super().get_initial()
        initial.update({'custom_user': self.request.user})
        return initial

forms.py

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

    choices = [('1', Result.decision.option1),
               ('2', Result.decision.option2),
               ]
    self.fields['vote'] = forms.ChoiceField(choices=choices,
                                            label="Choices",                           
                            widget=forms.RadioSelect())

    class Meta:
        model = Result
        fields = ['decision', 'vote']

models.py (если необходимо)

class Result(models.Model):
    custom_user = models.ForeignKey(CustomUser)
    decision = models.ForeignKey(Decision) * Decision 
                                             contains 
                                             decisions and 
                                             their choices 
                                (like 'option1', 'option2')
    vote = models.CharField()
    vote_eligible = models.BooleanField(default=False)

Ваша проблема в этой строке:

choices = [('1', Result.decision.option1),
           ('2', Result.decision.option2)]

Здесь вы устанавливаете варианты выбора в соответствии с полями модели. Вы не используете их значения. Их значения привязаны к конкретному экземпляру модели Result.

Обычно эта проблема требует, чтобы вы знали, какие экземпляры модели Result будут использоваться для опций. Обычно я передаю это в форме kwargs следующим образом:

def __init__(self, *args, **kwargs):
         results = kwargs.pop('results')
         super().__init__(*args, **kwargs)

         # Now we're using a model INSTANCE, not the model itself
         # Also, you don't need to use the number for a key value. Makes
         # it a bit easier.
         choices = []
         for result in results.all():
             choices.append(
                  (result.decision.option1, result.decision.option1),
                  (result.decision.option2, result.decision.option2)              
             )
         self.fields['vote'] = forms.ChoiceField(choices=choices, label="Choices", widget=forms.RadioSelect())

Затем в файле views.py добавьте get_form_kwargs для инициализации kwargs для вашей формы:

def get_form_kwargs():
    kwargs = super().get_form_kwargs()
    kwargs.update({'results': Result.objects.filter(custom_user=self.request.user)})

    return kwargs
Вернуться на верх