Как отфильтровать модель 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