Фильтр данных внешнего ключа, введенных пользователем в форму 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})

В нем могут быть ошибки, но я думаю, вы поняли мою идею.

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