2017-01-12 20 views
0

У меня есть сложные пользовательские разрешения для моих пользователей. Но чтобы сделать мысли проще, давайте представим себе, что для каждого пользователя есть только read-only или write.Создание форм Django формы return.instance в шаблонах

Я использую формы Django для редактирования и сохранения объектов модели. И моя цель заключается в рендеринге <input> в шаблоне HTML Django для тех пользователей, у которых есть разрешение на редактирование экземпляра данной модели, и жестко закодированные данные (без тега <input>), если у пользователя есть только разрешение только для чтения.

В настоящее время у меня есть следующий код в моем шаблоне Django для достижения этой цели:

{%if user.has_permission_to_edit %} 
    {{my_form.my_field}} 
{% else %} 
    {{my_form.instance.my_field}} 
{% endif %} 

И вот my_form:

class MyForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(MyForm, self).__init__(*args, **kwargs) 
     for field_name, field in self.fields.items(): 
      field.widget.attrs['class'] = 'form-control input-sm' 
      if field.required == True: 
       field.widget.attrs['required'] = '' 
    class Meta: 
     model = MyModel 
     fields = ('my_field',) 

Проблема с кодом в шаблоне, что я должен используйте несколько блоков {% if%} {% else%}. Я относительно новичок в Django, и я знаю, что существует множество передовых инструментов, делающих код Django потенциально супер DRY, поэтому я хочу спросить вас, ребята, какой самый DRY-метод для организации того, что я описал в шаблоне. В частности, есть ли способ сделать Django-формы возвращать значения экземпляров на основе некоторого условия, указанного внутри определения формы? Или мне нужно использовать определенный тег? Или, возможно, для достижения таких целей используется какая-то совершенно другая архитектура?

+1

Я не уверен, что понимаю, чего вы хотите достичь? Вы редактируете объект модели? Как изменяется поведение, если у пользователя есть разрешение на редактирование? – AKS

+0

Какой тип поля это, где вы хотите отображать жестко заданные значения? Это текстовое поле? – AKS

+0

Ну, это может быть текстовое поле, числовое значение, флажок ... Все. Основываясь на типе соответствующего типа поля модели –

ответ

0

Для того, что я понял из вашего вопроса, вы хотите передать экземпляр данных, извлеченных из вашего источника данных.

from .forms import MyForm 
from django.shortcuts import render 

Предполагаете, что вы создали файл forms.py на уровне views.py.

Извлечение данных из источника данных (Detail является модель в примере ниже)

detail_instance = Detail.objects.get(user=request.user.id) 
reg_form = MyForm(instance=detail_instance or None) 
# In case of edit scenario you can pass in the post params to the form as well 
reg_form = MyForm(request.POST, instance=detail_instance) 
# Or form with uploads 
reg_form = MyForm(request.POST, request.FILES, instance=detail_instance) 

Теперь, когда мы имеем данные внутри нашего параметра reg_form мы можем передать его в шаблоне

return render(request, 'applicant/register.html', { 'my_form' : reg_form}) 

Do что бы вы ни пожелали, с вашей переменной my_form в шаблоне.

НА ОСНОВЕ ОБНОВЛЕННОЙ ВОПРОСУ

Вы можете передать параметр в функцию инициализации одной из форм

reg_form = MyForm(exist = exist, some_param = param_value, instance=detail_instance or None) 

После прохождения параметров, то пары, могут быть выбраны и обработаны в функции инициализации из форма

class MyForm(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 
     exist = kwargs.pop('exist', None) 
     pk_reg = kwargs.pop('param', None) 
     super(MyForm, self).__init__(*args, **kwargs) 
     #do some stuff with you custom params here 
     if exist == True or pk_reg: 
      self.fields['username'].widget.attrs['readonly'] = True 

Приведенный выше подход имеет альтернативу также для отдельных форм для отдельной влажности ision и вызывать соответствующую форму на основе прав пользователя.

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