Django - Как заполнить варианты выбора в поле modelchoicefield полем из другой модели, отфильтрованным по вошедшему пользователю

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

models.py:

class Mealtypes(models.Model):
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    title = models.CharField(max_length=200, default='')
    description = models.TextField(default='')

class Specificmeals(models.Model):        
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    meal_name = models.CharField(max_length=200, default='')
    mealtype = models.CharField(max_length=200, default='')
    fruit = models.BooleanField(default=False)
    meat = models.BooleanField(default=False)
    dairy = models.BooleanField(default=False)

forms.py

from django import forms
from django.core.exceptions import ValidationError
from django.forms import ModelForm
from .models import Mealtypes, Specificmeals

class MealAdder(ModelForm):
class Meta:
    model = Specificmeals
    fields = [
        'meal_name',
        'mealtype',
        'fruit',
        'meat',
        'dairy',
    ]

widgets = {
        'text': forms.Textarea(attrs={"style": "height:10em;" "width:60em;"}),
        'mealtype': forms.ModelChoiceField(queryset=Mealtypes.title.filter(author='author')),
        'fruit': forms.CheckboxInput(attrs={"style": "margin-left:350px;"}),
        'meat': forms.CheckboxInput(attrs={"style": "margin-left:350px;"}),
        'dairy': forms.CheckboxInput(attrs={"style": "margin-left:350px;"}),
        }

Я пытаюсь играть с ModelChoiceField, чтобы заставить его запрашивать типы блюд из модели Mealtypes, отфильтрованные текущим пользователем, но я продолжаю получать ошибки атрибутов (объект не имеет атрибута...)

Что я делаю неправильно, и как я могу это решить?

Сначала добавьте следующее к вашей модели Mealtype, чтобы вы могли выводить фактическое название MealType:

def __str__(self):
    return f"{self.title}"

Затем, начните с передачи запроса пользователю в вашем представлении:

form = MealAdder(author=request.user)

А затем в вашем forms.py вы должны использовать queryset в __init__ форме следующим образом:

from django.forms import TextInput, CheckboxInput, Select, ModelChoiceField

    class MealAdder(ModelForm):
        def __init__(self, author, *args, **kwargs):
            super(MealAdder, self).__init__(*args, **kwargs)
            self.fields['mealtype'] = forms.ModelChoiceField(queryset=Mealtypes.objects.filter(author=author))
    
        class Meta:
            model = Specificmeals
            fields = ['author', 'meal_name', 'mealtype', 'fruit', 'meat', 'dairy']
            widgets = {
                'author': Select(),
                'meal_name': TextInput(attrs={"style": "height:10em;" "width:60em;"}),
                'fruit': CheckboxInput(attrs={"style": "margin-left:350px;"}),
                'meat': CheckboxInput(attrs={"style": "margin-left:350px;"}),
                'dairy': CheckboxInput(attrs={"style": "margin-left:350px;"})
            }

Не забудьте, что в форме должно быть поле author, так как оно не может быть null.

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