在我的模型中,“食品”领域是许多领域。当前,如果用户要创建新的膳食,则他们要添加的食物选择就是数据库中的每个食物。有没有一种方法可以使创建表单仅允许该选项仅添加当前用户制作的食品?我的ManytoMany所有字段都遇到此问题。
views.py
class MealCreateView(LoginRequiredMixin, CreateView):
model = Meal
success_url = '/dashboard/'
fields = ['name', 'foods']
def form_valid(self, form):
form.instance.user = self.request.user
return super().form_valid(form)
在meal_form.html中
<div class="content-section">
<form method="POST">
{% csrf_token %}
<fieldset class="">
<legend class="border-bottom mb-4">New Meal</legend>
{{ form|crispy }}
</fieldset>
<div class="">
<button class="btn btn-outline-info" type="submit">Add Meal</button>
</div>
</form>
</div>
在models.py中
class Food(models.Model):
name = models.CharField(max_length=100, default="")
user = models.ForeignKey(User, on_delete=models.CASCADE)
serving_size_g = models.DecimalField(default=100, max_digits=5, decimal_places=1)
protein = models.DecimalField(default=0, max_digits=5, decimal_places=1)
total_fats = models.DecimalField(default=0, max_digits=5, decimal_places=1)
saturated_fats = models.DecimalField(default=0, max_digits=5, decimal_places=1)
mono_unsaturated_fats = models.DecimalField(default=0, max_digits=5, decimal_places=1)
poly_unsaturated_fats = models.DecimalField(default=0, max_digits=5, decimal_places=1)
total_carbohydrates = models.DecimalField(default=0, max_digits=5, decimal_places=1)
energy = models.DecimalField(default=0, max_digits=5, decimal_places=1)
sugars = models.DecimalField(default=0, max_digits=5, decimal_places=1)
fiber = models.DecimalField(default=0, max_digits=5, decimal_places=1)
calcium = models.DecimalField(default=0, max_digits=5, decimal_places=1)
iron = models.DecimalField(default=0, max_digits=5, decimal_places=1)
magnesium = models.DecimalField(default=0, max_digits=5, decimal_places=1)
potassium = models.DecimalField(default=0, max_digits=5, decimal_places=1)
sodium = models.DecimalField(default=0, max_digits=5, decimal_places=1)
vitamin_c = models.DecimalField(default=0, max_digits=5, decimal_places=1)
class Meta:
'''Limits the user from making duplicates of food'''
unique_together = ('name', 'user', 'protein', 'total_fats', 'total_carbohydrates', 'energy', 'sugars', 'fiber', 'calcium',
'iron', 'magnesium', 'potassium', 'sodium', 'vitamin_c', 'saturated_fats', 'mono_unsaturated_fats', 'poly_unsaturated_fats')
class Meal(models.Model):
name = models.CharField(max_length=20)
user = models.ForeignKey(User, on_delete=models.CASCADE)
foods = models.ManyToManyField(Food)
是的,您可以定义一个可以解决ModelForm
此问题的方法:
# app/forms.py
from django import forms
from app.models import Food, Meal
class MealForm(forms.ModelForm):
def __init__(self, *args, user=None, **kwargs):
super().__init__(*args, **kwargs)
self.fields['foods'].queryset = Food.objects.filter(user=user)
class Meta:
model = Meal
fields = ['name', 'foods']
现在,在中CreateView
,我们可以利用这种形式,并为user
参数传递一个值:
# app/views.py
from app.forms import MealForm
class MealCreateView(LoginRequiredMixin, CreateView):
model = Meal
success_url = '/dashboard/'
form_class = MealForm
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs['user'] = self.request.user
return kwargs
def form_valid(self, form):
form.instance.user = self.request.user
return super().form_valid(form)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句