【问题标题】:Can't update data using class based view and django form无法使用基于类的视图和 django 表单更新数据
【发布时间】:2017-07-27 14:10:54
【问题描述】:

我无法使用 django 表单和基于类的视图来更新用户配置文件实例。 POST 请求使用正确的参数发送,模板正确重定向,但不幸的是用户配置文件没有更新。

请注意,我是 Django 新手,因此欢迎提供任何提示。

models.py

class UserProfile(models.Model):
    objects = models.Manager()
    user = models.OneToOneField(User)
    search_range = models.IntegerField(default=150)

    def __str__(self):
        return self.user.username

forms.py

class HomeForm(forms.ModelForm):

    class Meta:
        model = UserProfile
        fields = ('search_range',)

views.py

class HomeView(TemplateView):
    template_name = 'home/home.html'

    def get(self, request):
        form = HomeForm()

        args = {'form': form}
        return render(request, self.template_name, args)

    def post(self, request):
        form = HomeForm(request.POST, instance=request.user.userprofile)
        if form.is_valid():
            form.save()
            return redirect('home:home')

        args = {'form': form}
        return render(request, self.template_name, args)

urls.py

urlpatterns = [
    url(r'^$', HomeView.as_view(), name='home')
]

home.html

<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Submit</button>
</form>

【问题讨论】:

  • 代码看起来正确。您如何检查用户配置文件是否未更新?您是直接在数据库中检查还是根据某些显示进行检查?也可能是显示问题。例如,您不会将instance 关键字参数传递给get 操作中的表单。所以,我猜search_range 预填充了默认值(150)。
  • @AntoinePinsard 你是对的,这是一个显示问题。我没有注意到数据库中的数据正在正确更新。以 get 方法形式传递实例解决了这个问题。非常感谢!

标签: python django django-forms django-views


【解决方案1】:

您的代码看起来不错。用户配置文件可能已保存,但由于您没有在 get 方法中将 instance 关键字参数传递给表单,因此 search_range 会预填充默认值 (150)。

def get(self, request):
    form = HomeForm(instance=request.user.userprofile)

    args = {'form': form}
    return render(request, self.template_name, args)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 2013-10-03
    • 2012-08-16
    • 2021-09-27
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多