2014-01-12 2 views
1

Я постоянно сталкиваюсь с этим шаблоном, и мне интересно, есть ли лучший способ справиться с этим. Многие мои модели рассматривают идею «создателя» - другими словами, я хочу, чтобы пользователь, создавший объект, был сохранен как создатель. Таким образом, мои модели почти всегда включают в себяДизайн Django Design - request.user в модели

creator = models.ForeignKey(User) 

Там, кажется, не быть способом недобросовестных этого пользователя к пользователю, который его создал (request.user). Таким образом, я считаю себя построение модели форм и добавления создателя как HiddenInput()

class MyModelForm(ModelForm): 
    class Meta: 
     model = MyModelForm 
     fields = ['name', 'creator'] 
     widgets = { 
      'creator': HiddenInput() 
     }   

, а затем связывание форму в представлении с начальным

form = MyModelForm(initial={'creator': request.user}) 

и проверка на POST, чтобы убедиться, что никто не dickered (вид сверху):

def create(request): 
    form = MyModelForm(initial={'creator': request.user}) 
    if request.method == 'POST': 
     if int(request.POST['creator']) != int(request.user.id): 
      return render(request,'500.html', {'message':'form tampering detected'}) 
     form = FeedGroupForm(request.POST) 
     if form.is_valid(): 
      form.save() 
      return HttpResponseRedirect(reverse('index')) 
    return render(request, 'mymodelformpage.html',{'form':form}) 

У меня все в порядке, но это похоже на анти-шаблон. Мне кажется, что должен быть способ дефолта создателя в модели.

creator = models.ForeignKey(User, default=request.user) 

Возможно ли это в post_save?

+0

Если вы включите создателя в форму, которую любой может обмануть и изменить в браузере) – Pol

ответ

3

Нет, это неправильный путь. Правильный способ состоит в том, чтобы исключить поле создателя из формы, а затем установить его на сохранение:

if form.is_valid: 
    obj = form.save(commit=False) 
    obj.creator = request.user 
    obj.save() 
    ... redirect ... 
Смежные вопросы