如何使用UpdateView更新Django模型?

xyz*_*ace 20 django view

我正在尝试使用基于类的通用视图UpdateView更新Django中的模型.

我阅读了使用基于类的UpdateView在Django中更新用户模型的页面,试着让我开始,但是我收到一个错误'WSGIRequest'对象没有属性'id'

我是Django的新面孔,所以如果我做一些愚蠢的事情,请原谅.

//urls.py

url(r'^portfolios/update/(?P<id>\d+)/$',PortfoliosUpdateView.as_view()),
Run Code Online (Sandbox Code Playgroud)

//views.py

class PortfoliosUpdateView(UpdateView):
    form_class = PortfoliosCreateForm
    model = Portfolios
    template_name = 'portfolios/create.html'

    def get(self, request, **kwargs):
        self.object = Portfolios.objects.get(id=self.request.id)
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        context = self.get_context_data(object=self.object, form=form)
        return self.render_to_response(context)

    def get_object(self, queryset=None):
        obj = Portfolios.objects.get(id=self.request.id)
        return obj
Run Code Online (Sandbox Code Playgroud)

它主要只是最初发布的代码的修改版本,但我认为它有用.我知道我正在尝试检索作为GET参数传递的id,但在请求变量中似乎没有.我是以错误的方式来做这件事的吗?

谢谢

编辑:我想我修好了,但这可能是错的:我换了线

self.object = Portfolios.objects.get(id=self.request.id)
obj = Portfolios.objects.get(id=self.request.id)
Run Code Online (Sandbox Code Playgroud)

self.object = Portfolios.objects.get(id=self.kwargs['id'])
obj = Portfolios.objects.get(id=self.kwargs['id'])
Run Code Online (Sandbox Code Playgroud)

我错了.

bmi*_*lac 24

它应该是:

def get_object(self, queryset=None):
    obj = Portfolios.objects.get(id=self.kwargs['id'])
    return obj
Run Code Online (Sandbox Code Playgroud)

查看基于类的通用视图调度解释关键字参数已分配给self.kwargs:

def dispatch(self, request, *args, **kwargs):
    # Try to dispatch to the right method; if a method doesn't exist,
    # defer to the error handler. Also defer to the error handler if the
    # request method isn't on the approved list.
    if request.method.lower() in self.http_method_names:
        handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
    else:
        handler = self.http_method_not_allowed
    self.request = request
    self.args = args
    self.kwargs = kwargs
    return handler(request, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)


Bur*_*lid 7

id = self.request.GET.get('id',None) 是您尝试访问GET查询字符串时所需的.

但是,您的视图可以简化:

from django.conf.urls import *
from django.views.generic import UpdateView
from yourapp.models import Portfolios
from yourapp.forms import PortfoliosCreateForm

urlpatterns = patterns('',
    url('^portfolios/update/(?P<pk>[\w-]+)$', UpdateView.as_view(
        model=Portfolios,
        form_class=PortfoliosCreateForm,
        template_name='portfolios/create.html',
        success_url='/portfolios'
    ), name='portfolio_update'),
)
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢将我的视图包装在 `myapp.views` 中。例如在`myapp.views`中:`portfolio_update = UpdateView.as_view(...)`,然后在urlconf中我只需要输入`url(r'pattern', "myapp.views.portfolio_update", name="portfolio_update ")`。不适合所有目的,但我发现它对我的大多数观点来说更清晰。 (2认同)
  • 虽然这是一个完全有效的解决方案,但最好的Django实践建议保留views.py而不是url模式的逻辑. - 来自Django的两个独家新闻 (2认同)
  • 我发布的片段中没有逻辑.@JacobValenta (2认同)