Фильтр данных внешнего ключа, введенных пользователем в форму Django
У меня есть модель, которая имеет внешний ключ. Я хочу, чтобы в любое время, когда пользователь заполняет форму, только данные, введенные пользователем в модель внешнего ключа, показывались ему в виде выпадающего списка.
Model.py
class Nomination(models.Model):
fullname = models.CharField(max_length=120)
nominee_id = models.CharField(max_length=100, default=increment_invoice_number, null=True, blank=True)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
image = models.ImageField(upload_to='nominations_images')
slug = models.SlugField(max_length=150, blank=True)
votes = models.IntegerField(default=0, blank=True)
date = models.DateTimeField(auto_now_add=True)
createdby = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True, blank=True)
forms.py
class CategoryForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(CategoryForm, self).__init__(*args, **kwargs)
# access object through self.instance...
self.fields['createdby'].queryset = Award.objects.filter(createdby=self.instance.user)
class Meta:
model = Category
fields = "__all__"
Вот какую ошибку я получаю.
'Nomination' object has no attribute 'user'
Я не понимаю, как у вас возникла эта ошибка, ведь у вас форма для модели Category
, а self.instanse
должна содержать объект Category
, а не Nomination
. В любом случае, если вам нужно использовать текущего пользователя для фильтрации формы, вы можете получить его в качестве аргумента формы.
forms.py
class MyFilteredForm(ModelForm):
def __init__(self, user, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['createdby'].queryset=Award.objects.filter(createdby=user)
...
views.py
class SomeView(View):
def get(self, request, *args, **kwargs):
form = MyFilteredForm(request.user)
return render(request, 'form.html', {'form': form})
В нем могут быть ошибки, но я думаю, вы поняли мою идею.