2015-08-11 1 views
0

Я пытаюсь использовать Django UpdateView для отображения формы обновления для пользователя. https://docs.djangoproject.com/en/1.8/ref/class-based-views/generic-editing/Django Class Based View UpdateView Ограниченный пользователь

Я только хочу, чтобы пользователь мог редактировать свою собственную форму.

Как я могу фильтровать или ограничивать объекты в модели только отображать объекты, принадлежащие аутентифицированному пользователю?

Когда пользователь имеет только один объект, я могу использовать это:

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

Однако мне теперь нужно, чтобы пользователь имел возможность редактировать несколько объектов.

ОБНОВЛЕНИЕ:

класс 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) 

класс 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'), 

ответ

1

UpdateView - только для одного объекта; вам нужно будет реализовать ListView, который будет отфильтрован для объектов, принадлежащих этому пользователю, и затем соответствующим образом отредактируйте ссылки.

Чтобы запретить кому-то просто явно указывать URL-адрес для редактирования, вы можете переопределить get_object (как вы это делаете в своем вопросе) и вернуть соответствующий ответ.

Я успешно смог сгенерировать представление списка и получить вид обновления для работы, передав PK. Однако при попытке переопределить get_object UpdateView, я все еще сталкиваюсь с проблемами.

Просто переопределить метод 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; по одному для каждого из объектов - или просто используйте обычный метод на основе представления с несколькими объектами.

+0

Спасибо. Я успешно смог создать представление списка и получить представление обновления для работы, передав PK. Однако при попытке переопределить getView для UpdateView я все еще сталкиваюсь с проблемами. См. Обновленный код выше. – user3913192

+0

Большое спасибо! – user3913192

0

Как указывалось в предыдущем ответе, действуйте в списке, чтобы отображать только элементы, принадлежащие пользователю. Затем в обновлении просмотра вы можете ограничить QuerySet, который используется, чтобы выбрать объект, перекрывая

def get_queryset(self): 
    qs = super(YourUpdateView, self).get_queryset() 
    return qs.filter(user=self.request.user)