Django Class 基于视图 UpdateView 受限用户

Django Class Based View UpdateView Restricted User

我正在尝试使用 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 实验列表(列表视图):

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 实验更新(更新视图):

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'),

UpdateView只针对一个对象;您需要实施 ListView 过滤属于该用户的对象,然后适当地提供编辑链接。

为了防止有人简单地将 URL 用于编辑视图,您可以覆盖 get_object(正如您在问题中所做的那样)和 return 适当的响应。

I have successfully been able to generate the list view and can get the update view to work by passing a PK. However, when trying to override the UpdateView get_object, I'm still running into problems.

简单地覆盖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 中使用自定义表单 类;每个对象一个 - 或者简单地对多个对象使用基于方法的普通视图。

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

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