【问题标题】:FormView not saving data in DjangoFormView 不在 Django 中保存数据
【发布时间】:2020-10-02 11:04:43
【问题描述】:

我试图让用户通过提交表单来保存特定锻炼的锻炼详情。我的 ExerciseDetailView 显示我想要的形式:

class ExerciseDetailView(DetailView):
    model = Exercise
    template_name = 'workouts/types.html'

    def get_context_data(self, **kwargs):
        context = super(ExerciseDetailView, self).get_context_data(**kwargs)
        context['form'] = WorkoutModelForm
        return context

但我的问题是将输入的数据保存在数据库中。我尝试过同时制作 FormView 和 CreateView 但显然缺少一些东西:

class ExerciseFormView(FormView):
    form_class = WorkoutModelForm
    success_url = 'workouts:exercise_detail'

    def form_valid(self, form):
        form.save()
        return super(ExerciseFormView, self).form_valid(form)

这是我引用的 WorkoutModelForm:

class WorkoutModelForm(forms.ModelForm):
    class Meta:
        model = Workout
        fields = ['weight', 'reps']

我的模板:

<form action="{% url 'workouts:workout' exercise.id %}" method="post">
    {% csrf_token %}
    {{ form }}
    <button type="submit">Save</button>
</form>

网址:

path('exercise/<int:pk>/detail/', ExerciseDetailView.as_view(), name='exercise_detail'),
path('exercise/<int:pk>/detail/', ExerciseFormView.as_view(), name='workout'),

这里是我的锻炼模型,其中包含一个 get_absolute_url 方法:

class Workout(models.Model):
    weight = models.FloatField(default=0)
    reps = models.PositiveIntegerField(default=0)
    created = models.DateField(auto_now_add=True)
    updated = models.DateField(auto_now=True)
    exercise = models.ForeignKey(Exercise, on_delete=models.CASCADE, default=None)

    def get_absolute_url(self):
        return reverse('exercise_detail', args=[str(self.pk)])

我没有收到任何错误,但是当我提交表单时,我的 url 保持不变,正如我所希望的那样,但是页面只是显示为空白并且没有记录对象。谁能帮我看看是什么问题?

【问题讨论】:

  • 网址完全重叠,所以它总是会采用第一个视图(ExerciseDetailView)。

标签: django modelform formview


【解决方案1】:

问题不在于你的视图,Django 逻辑永远不会触发这个视图,URL 是完全重叠的,所以这意味着对于一个 URL,它总是会触发第一个视图(这里是 ExerciseDetailView),你应该使路径不重叠,例如:

path('exercise/<int:pk>/detail/', ExerciseDetailView.as_view(), name='exercise_detail'),
path('exercise/<int:pk>/workout/', ExerciseFormView.as_view(), name='workout'),

然而,触发逻辑是不够的,因为它不会将Workout 链接到必要的练习,您可以将逻辑更改为:

from django.urls import reverse

class ExerciseFormView(CreateView):
    form_class = WorkoutModelForm

    def form_valid(self, form):
        form.instance.exercise_id = self.kwargs['pk']
        return super().form_valid(form)

    def get_success_url(self):
        return reverse('workouts:exercise_detail', kwargs={'pk': self.kwargs['pk']})

【讨论】:

  • 感谢您的回复,尽管在提交时我现在在 /exercise/1/workout NOT NULL constraint failed: workouts_workout.exercise_id 收到一个完整性错误
  • @sgt_pepper85:抱歉,我打错了:是form.instance.exercise_id = ...
  • 天才。它现在运行良好。非常感谢您的帮助
【解决方案2】:

需要使用CreateView

from django.views.generic.edit import CreateView

class ExerciseFormView(CreateView):
    form_class = WorkoutModelForm

...

【讨论】:

    猜你喜欢
    • 2014-01-18
    • 2012-06-07
    • 2023-03-13
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多