如何解决如何在Django中更新特定的Manytomany字段
“我的区域”模型的运动属性具有对我的运动模型的ManyToManyField:
class Area(models.Model):
name = models.CharField(max_length=100)
exercise = models.ManyToManyField(Exercise)
class Exercise(models.Model):
name = models.CharField(max_length=100)
我的AreaView显示一个区域列表,每个区域都链接到它们自己的特定练习列表,由AreaDetailView显示:
class AreaView(ListView):
model = Area
template_name = 'workouts/areas.html'
class AreaDetailView(DetailView):
model = Area
template_name = 'workouts/exercises.html'
def get_context_data(self,**kwargs):
context = super(AreaDetailView,self).get_context_data(**kwargs)
context['e_form'] = AddExerciseForm
return context
例如:
areas.html
- abs
- biceps
- cardio
- legs ...
exercises.html
Abs
- Ab-wheel
- Cable-crunch
- Plank ...
Biceps
- Barbell curl
- Cable curl
- Dumbbell curl
AreaDetailView还显示了一个表格,我想允许用户创建自己的练习,该练习将特定于他们相应的区域。
这是我的表格:
class AddExerciseForm(forms.ModelForm):
class Meta:
model = Exercise
fields = ['name']
我的模板:
<form action="{% url 'exercise_add_new' %}" method="post">
{% csrf_token %}
{{ e_form }}
<button type="submit">Save changes</button>
</form>
我的网址:
path('exercise-add-new',ExerciseFormView.as_view(),name='exercise_add_new'),
这是应该处理逻辑的我的CreateView:
class ExerciseFormView(CreateView):
form_class = AddExerciseForm
success_url = '/'
def form_valid(self,form):
form.save()
new_ex = Exercise.objects.latest('id')
area = Area.objects.get(id=1)
area.exercise.add(new_ex)
return super(ExerciseFormView,self).form_valid(form)
这可以让我更新我的Area模型中的第一个对象,但是我需要调整area
中变量form_valid
的值,以便更新当前的'id'。例如,如果我单击“二头肌”然后填写表格,我想添加一个与“ id = 2”相关的练习
我已经尝试过area = Area.objects.get(id=self.kwargs['id'])
和其他类似的变体,但到目前为止我没有尝试过
解决方法
您要在ExerciseFormView
中向某个区域添加新练习还是创建新区域?
如果要添加新的练习,则必须从area-id
中传递URL
,类似于add_exercise/<area_id>
,如果执行后者则应该很简单。
您在URL中通过了area-id
,您可以在下面进行操作
path('exercise-add-new/<int:area_id>/',ExerciseFormView.as_view(),name='exercise_add_new')
然后如下更新您的view
def form_valid(self,form):
form.save()
area = Area.objects.get(pk=self.kwargs["area_id"])
new_ex = Exercise.objects.latest('id')
area.exercise.add(new_ex)
return super(ExerciseFormView,self).form_valid(form)
还将模板更新为:
<form method="post">
{% csrf_token %}
{{ e_form }}
<button type="submit">Save changes</button>
</form>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。