2012-05-18 3 views
0

У меня есть модель, скажем, «Статьи», с полемКак динамически установить значение поля в представлениях?

published = models.BooleanField(default=True) 

и шаблон с условием:

{% if user.is_staff %} 
    <li>form.published.label_tag</li> 
    <li>form.published</li> 
{% else %} 
    <li>form.published.as_hidden</li> 
{% endif %} 

и я использую общие взгляды на основе классов для добавления и обновления для этой модели ,

В этом случае для обычных сотрудников и злоумышленников по-прежнему возможно заменить значение published.

Я думаю, что я должен переместить условие просмотров уровня, чтобы предотвратить эту проблему, somithing как

class ArticleEdit(UpdateView): 
    model = Article 
    form_class = ArticleForm 

    def form_valid(self, form): 
     self.object = form.save(commit=False) 
     if self.request.user.is_staff: 

      ''' How to let the staff change this value? ''' 

     else: 

      ''' How to set previous value? ''' 

     self.object.save() 
     return HttpResponseRedirect(self.get_success_url()) 

при условии, что я удалить это скрытое поле из шаблона.

ответ

2

Я бы рассмотрел определение двух форм, один для персонала и один для обычных пользователей. Затем вы можете переопределить метод get_form_class, чтобы выбрать правильную форму. Если вы исключаете поле published из формы для не-персонала, то они не смогут изменить значение.

class ArticleForm(forms.ModelForm): 
    class Meta: 
     model = Article 
     exclude = ('published',) 


class ArticleStaffForm(ArticleForm) 
    class Meta: 
     model = Article 
     exclude =() 

class ArticleEdit(UpdateView): 
    ... 
    def get_form_class(self): 
     if self.request.user.is_staff: 
      return ArticleStaffForm 
     else: 
      return ArticleForm 
+0

Этот код установит 'опубликовано' на' False', даже если это было 'True' перед редактированием. Как мне это преодолеть? Спасибо, что нашли время помочь. –

+0

Он не должен этого делать. Я думаю, проблема может быть в вашем шаблоне. Попробуйте представить форму как '{{form}}' и посмотреть, все ли это происходит. – Alasdair

+0

К сожалению, мои плохие :) Ваше предложение работает. Еще раз спасибо! –

0

вы можете сделать что-то вроде:

class MyForm(forms.Form): 
    def __init__(self, user, *args, **kwargs): 
     super(MyForm, self).__init__(*args, **kwargs) 
     if not user.is_staff: 
      del self.fields['published'] 

, а затем передать объект request.user в форму, когда инициализация его.

ВНИМАНИЕ: Неподтвержденный псевдокод. Но это должно дать вам представление.

+0

Этот код только удаляет поле из формы. Это не так, поскольку я вручную показываю каждое поле, а не через '{{form.as_ul}}'. Вопрос заключается в том, как реализовать этот псевдокод: 'if (user.is_staff) {прочитать ввод пользователя и сохранить его} else {оставить значение неизменным'} –

+0

Чтобы этот подход работал, вам нужно сделать что-то вроде переопределения 'get_form_kwargs', чтобы предоставить аргумент' user' при инициализации формы. – Alasdair

+0

Хорошо, если я каким-то образом передаю объект 'user', чтобы сформировать и узнать, не пользователь ли' is_staff', как мне установить поле 'published' до его собственного значения перед редактированием (например, если оно было ранее« True »)? –

Смежные вопросы