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.