Estoy tratando de hacer un formulario de modelo con un widget de elección de modelo que hereda sus opciones de otro modelo que el modelo al que está conectado el formulario de modelo, y esta selección debe ser filtrada por el usuario conectado actual. El siguiente ejemplo ilustra mis intenciones: digamos que tengo dos modelos diferentes donde un modelo le permite al usuario registrar tipos de comidas (desayuno, cena, etc.), y el otro modelo le permite al usuario crear comidas específicas basadas en esos tipos de comidas, con el siendo la variable de conexión el título del tipo de comida.
modelos.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)formularios.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;"}), }Estoy tratando de jugar con ModelChoiceField para que consulte los tipos de comida del modelo Mealtypes filtrado por el usuario actual, pero sigo recibiendo errores de atributo (el objeto no tiene atributo...)
¿Qué estoy haciendo mal y cómo puedo solucionarlo?
Primero, agregue lo siguiente a su modelo Mealtype , para que pueda generar el título real del MealType:
def __str__(self): return f"{self.title}"Luego, comience pasando la solicitud de usuario en su vista:
form = MealAdder(author=request.user) Y luego en sus forms.py debe usar el conjunto de consultas en el __init__ del formulario como el siguiente:
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'] = 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;"}) } No olvide que debe tener un campo de author en el formulario, ya que no puede ser nulo.