微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Django中更新特定的Manytomany字段

如何解决如何在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 举报,一经查实,本站将立刻删除。