如何在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>

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...