2016-04-19 7 views
0

Я хочу сделать что-то простое, используя Crispy Forms; Я хочу показать Fieldset только в том случае, если пользователь принадлежит к группе персонала. Это легко решается в стандартных шаблонов, как это:Условно отображать Fieldset с хрустящими формами

{% if user.is_staff %} show extra stuff {% endif %}

Может быть, я что-то пропустил в руководстве, но я не вижу, как я могу просто придать тег шаблона, как «{%, если user.is_staff %} "в макушку хрустящей формы. Было бы идеально подходит для моего случая использования, если я мог бы что-то вроде следующего, где я использую фиктивный «Djangotag», чтобы решить мою проблему:

self.helper.layout = Layout(
    Fieldset(
     'Section One', 
     'name', 
     'description', 
    ), 
    Djangotag('{% if user.is_staff %}'), 
    Fieldset(
     'Conditional Fieldset', 
     'field1', 
     'field2', 
    ), 
    Djangotag('{% endif %}'),  
    Fieldset(
     'More Details', 
     'detail1', 
     'detail2', 
    ), 
) 

есть простой способ сделать это с хрустящими формами?


Примечание: Я уже реализован self.user = kwargs.pop('user') подхода, и это не очень элегантные, я до сих пор ищу что-то лучше.

Я также попытался создать простые шаблоны для операторов if и пробовал это, HTML("{% include 'helpers/is_staff.html' %}"),, но процесс визуализации завершился неудачно.

ответ

2

Вы можете передать контекст запроса в вашу форму из представления, а затем использовать его в своем хелпе. Что-то вроде этого:

В функции зрения, что создает форму:

form = MyForm(request.POST, user=getattr(request, 'user', None)) 

Тогда в __init__ методе вашей формы:

def __init__(self, *args, **kwargs): 
    self.user = kwargs.pop('user', None) 
    super(MyForm, self).__init__(args, kwargs) 

И, наконец, в вашем коде формы макета:

if user and user.is_staff: 
    self.helper.layout.append(Fieldset(
     'Conditional Fieldset', 
     'field1', 
     'field2', 
    ), 

Я только что добавил этот набор полей к концу макета. documentation дает вам другие варианты обновления макетов на лету.

+0

Это точный подход, который я начал реализовывать. Затем я понял, что мне нужно будет обезьянно с добавлением полей и виджетов и т. Д. Платформа Django так элегантно решает этот прецедент, что этот хак становится уродливым и кажется неприемлемым для меня, хотя он работает. – eezis

0

Я не нашел более чистого пути, поэтому я завершил его так, как я начал.

Вот вид ...

class ModelCreateView(LoginRequiredMixin, CreateView): 
.... 
def get_form_kwargs(self): 
    # I am going to stuff the user object into the view so that 
    # I can use it in ModelForm to check the user and build the form 
    # conditionally 
    kwargs = super(ModelCreateView, self).get_form_kwargs() 
    kwargs.update({'user': self.request.user}) 
    return kwargs 

В ModelForm это было проще всего предположить, что поля были всегда нужны - поэтому я объявил их все в мета-секции - то условно удалить поля, и условно добавить форму ...

class YourCrispyForm(forms.ModelForm): 
.... 
def __init__(self, *args, **kwargs): 
    self.user = kwargs.pop('user') 
    super(YourCrispyForm, self).__init__(*args, **kwargs) 

    # remove conditional fields 
    if self.user and self.user.is_staff: 
     pass 
    else: 
     del self.fields['field_name'] 
     del self.fields['field_name'] 
     del self.fields['field_name'] 

    if self.user and self.user.is_staff: 
     self.helper.layout.append( 
     Fieldset(
      'Conditional Sections', 
      Row(
       Div('field_name', css_class="col-md-2"), 
       Div('field_name', css_class="col-md-2"), 
       ... 
      ), 
     ) 
     ) 

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

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