基于Django类的视图UpdateView受限用户

时间:2015-08-11 02:42:10

标签: python django django-class-based-views

我正在尝试使用Django UpdateView来显示用户的更新表单。 https://docs.djangoproject.com/en/1.8/ref/class-based-views/generic-editing/

我只希望用户能够编辑自己的表单。

如何过滤或限制模型中的对象以仅显示属于经过身份验证的用户的对象?

当用户只有一个对象时,我可以使用它:

def get_object(self, queryset=None):
        return self.request.user.profile.researcher

但是,我现在需要用户能够编辑多个对象。

更新:

class ExperimentList(ListView):

model = Experiment
template_name = 'part_finder/experiment_list.html'

def get_queryset(self):
    self.researcher = get_object_or_404(Researcher, id=self.args[0])
    return Experiment.objects.filter(researcher=self.researcher)

class ExperimentUpdate(UpdateView):

model = Experiment
template_name = 'part_finder/experiment_update.html'
success_url='/part_finder/'
fields = ['name','short_description','long_description','duration', 'city','address', 'url']

def get_queryset(self):
    qs = super(ExperimentUpdate, self).get_queryset()
    return qs.filter(researcher=self.request.user.profile.researcher)

URL:

url(r'^experiment/update/(?P<pk>[\w\-]+)/$', login_required(ExperimentUpdate.as_view()), name='update_experiment'),

2 个答案:

答案 0 :(得分:2)

UpdateView仅适用于一个对象;您需要实现针对属于该用户的对象进行过滤的ListView,然后相应地提供编辑链接。

为了防止有人明确地为编辑视图添加网址,您可以覆盖get_object(正如您在问题中所做的那样)并返回相应的回复。

  

我已成功生成列表视图并可以获取   通过传递PK来更新视图。但是,在尝试时   覆盖UpdateView get_object,我仍遇到问题。

只需覆盖get_queryset方法:

def get_queryset(self):
  qs = super(ExperimentUpdate, self).get_queryset()

  # replace this with whatever makes sense for your application
  return qs.filter(user=self.request.user)

如果您执行上述操作,则无需覆盖get_object

另一个(更复杂的)选项是在UpdateView中使用自定义表单类;每个对象一个 - 或者只是使用带有多个对象的普通方法视图。

答案 1 :(得分:0)

如上一个答案所示,请对列表进行操作,仅显示属于该用户的元素。 然后在更新视图中,您可以通过覆盖

来限制用于选择对象的查询集
def get_queryset(self):
    qs = super(YourUpdateView, self).get_queryset()
    return qs.filter(user=self.request.user)