Разрешить пользователям создавать ингредиенты с помощью CreateView и поля ManyToMany
У меня есть форма, в которой пользователи могут создавать ингредиенты, используя jQuery Plugin для Custom Tags.
При отправке формы возникает ошибка Field 'id' expected a number but got 'b'.
, где каждая буква в ингредиенте (по сравнению со словом) воспринимается как элемент, который, как ожидается, уже существует в базе данных.
# form.py
class EatForm(forms.ModelForm):
notes = forms.CharField(widget=forms.Textarea(attrs={"rows":3}),required=False)
ingredient = forms.CharField(widget=forms.TextInput(),required=False)
allergen = forms.CharField(widget=forms.TextInput(),required=False)
class Meta:
model = Eat
fields = ["name", "notes", "meal","ingredient","allergen","favorite","datetime"]
# Models
class Eat(models.Model):
MEAL_CHOICES = (
("breakfast", "Breakfast"),
("lunch", "Lunch"),
("dinner", "Dinner"),
("supper", "Supper"),
("snack", "Snack"),
("drink", "Drink"),
)
id = models.BigAutoField(primary_key=True, editable=False)
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
name = models.CharField(max_length=255)
notes = models.CharField(max_length=255, blank=True, null=True)
meal = models.CharField(choices=MEAL_CHOICES, max_length=20)
ingredient = models.ManyToManyField(Ingredient,blank=True)
allergen = models.ManyToManyField(Allergen,blank=True)
favorite = models.BooleanField(default=False)
datetime = models.DateTimeField()
# View
class EatFormAddView(LoginRequiredMixin, CreateView):
model = Eat
template_name = "dashboard.html"
success_url = reverse_lazy("core:activity")
form_class = EatForm
# get user
# def get_object(self):
# return self.request.user
# determine which submit button was pressed
def form_valid(self, form):
form.instance.user = self.request.user
ingredients = form.cleaned_data['ingredient'].split(',')
for ingredient in ingredients:
try:
ingredient_obj = Ingredient.objects.get(name=ingredient)
except:
ingredient_obj = Ingredient(name=ingredient)
ingredient_obj.save()
return super().form_valid(form)
Я создал поле формы, которое не было частью ModelForm, обработал его, а затем связал его с постом.