2015-07-03 2 views
2

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

Я установил форму, чтобы включить раскрывающееся меню, которое является значением по умолчанию для этого поля, и мой вопрос: где лучше всего изменить виджет на скрытый, имея в виду, что мне нужен запрос, чтобы я мог " t сделать это в формах init, что является очевидным местом.

Пробовал этот подход, но поле остается видимым:

class DocForm(forms.ModelForm): 


    class Meta: 
     model = Document 
     fields = __all__ 
     widgets = {"creator": forms.HiddenInput(),} 

    def __init__(self, *args, **kwargs): 
     #cant do it here because don't have request 

class DocAddView(CreateView): 


    form_class = DocForm 


    def get_form_class(self): 
     form_class = super(DocAddView, self).get_form_class() 
     form_class.Meta.widgets['category'] = forms.HiddenInput() 
     return form_class 

ответ

2

Изменить __init__ метод вашей формы, чтобы принять объект запроса.

class DocForm(forms.ModelForm): 
    ... 
    def __init__(self, request, *args, **kwargs): 
     super(DocForm, self).__init__(*args, **kwargs) 
     use_hidden_input = do_something_with_request(request) 
     if use_hidden_input: 
      self.fields['category'].widget = forms.HiddenInput() 

Затем переопределить get_form_kwargs, так что вид передает запрос в форму.

class DocAddView(CreateView): 
    ... 
    def get_form_kwargs(self): 
     # grab the current set of form #kwargs 
     kwargs = super(DocAddView, self).get_form_kwargs() 
     # Update the kwargs with the user_id 
     kwargs['request'] = self.request 
     return kwargs 

Этот подход объясняется в this blog post.

+0

Perfect. Благодарю. – PhoebeB