Представление, основанное на функции Django, и представление, основанное на классе
У меня есть этот URL http://127.0.0.1:8000/upload/picturelist/1
, что делает user_id = 1,
В моем urls.py
url(r'^picturelist/(?P<user_id>\d+)$', views.pictureList),
На мой взгляд.
def pictureList(request, user_id):
if int(user_id) != request.user.id:
raise PermissionDenied
Как я могу сделать это представление на основе функции, чтобы использовать createview?
class pictureList(CreateView):
2 ответа
Решение
Вы могли бы сделать что-то вроде этого:
В urls.py: url(r'^picturelist/(?P<user_id>\d+)$', views.MakeItView.as_view()),
В views.py:
class MakeItView(CreateView):
model = myModel
template_name = 'whatever.html'
def get_context_data(self, **kwargs):
context = super(MakeItView, self).get_context_data(**kwargs)
if int(self.kwargs['user_id']) != self.request.user.id:
raise PermissionDenied
return context
Я никогда не использовал CreateView
, но вот что я собираю, читая документы:
Вы можете сделать это, определив form_valid:
Посмотреть:
class pictureList(CreateView):
model = YourModelHere
fields = ['whatever','fields','you','want','edited']
def form_valid(self, form):
record = form.save(commit = False)
# assuming the user id is associated
# to the model with fieldname user_id
if (self.request.user == record.user_id):
record.save()
return HttpResponseRedirect(self.get_success_url())
# not sure if this works:
return self.form_invalid()
Тогда шаблон будет в 'yourappname/yourmodelhere_form.html'
,
См. CreateView для примера.