首页 > 解决方案 > 如何显示表单实例?

问题描述

如何传递带有实际填写的配置文件信息的表单(如函数视图中的 ProfileUpdateForm(instance=x))。我是这样做的,不知道如何将实际的配置文件实例传递给表单。UpdateView 之类的东西,但在我的 DetailView 类中

 class ProfileDetailView(FormMixin, DetailView):
    model = Profile
    context_object_name = 'profile'
    template_name = 'profiles/myprofile.html'
    form_class = ProfileUpdateForm

    def post(self, request, *args, **kwargs):
        form = self.get_form()
        if form.is_valid():
            return self.form_valid(form)
        else:
            return self.form_invalid(form)

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

    def get_success_url(self):
        return reverse_lazy('profiles:profile', kwargs={'pk': self.get_object().pk})

标签: pythondjango

解决方案


如果你想更新一个模型的实例,你应该使用UpdateView[Django docs]

from django.urls import reverse
from django.views.generic.edit import UpdateView

class ProfileDetailView(UpdateView):
    model = Profile
    context_object_name = 'profile'
    template_name = 'profiles/myprofile.html'
    form_class = ProfileUpdateForm
        
    def get_success_url(self):
        # Use `reverse` instead of `reverse_lazy`. You will get an error otherwise!
        return reverse('profiles:profile', kwargs={'pk': self.get_object().pk})

此外,如果需要将关键字参数传递给表单(在这里instance,尽管我建议坚持使用UpdateView),您应该覆盖get_form_kwargs

class MyView(SomeGenericView):
    ...
    
    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        kwargs['some_kwarg'] = 'Some value'
        # Your use case implies below line
        # kwargs['instance'] = self.get_object()
        return kwargs

推荐阅读