Джанго: Установить выбор полей из вида? - PullRequest
7 голосов
/ 12 августа 2010

У меня есть некоторые <selects>, которые мне нужно заполнить некоторыми choices, которые зависят от текущего пользователя, вошедшего в систему. Я не думаю , что это возможно (или просто) сделать изнутри класса формы, так что я могу просто оставить выбор пустым и вместо этого установить их в виде? Или какой подход мне выбрать?

Ответы [ 4 ]

5 голосов
/ 12 августа 2010

Не уверен, что это лучший ответ, но в прошлом я устанавливал поле выбора в init формы - вы могли бы потенциально передать свой выбор конструктору вашей формы. ...

2 голосов
/ 12 августа 2010

Вы можете динамически создавать свою форму в своем представлении (ну, на самом деле, я бы предпочел оставить код вне представления в своей собственной функции и просто вызвать его в представлении, но это только детали)

Я сделал это в одном проекте:

user_choices = [(1, 'something'), (2, 'something_else')]
fields['choice'] = forms.ChoiceField(
    choices=user_choices,
    widget=forms.RadioSelect,
)
MyForm = type('SelectableForm', (forms.BaseForm,), { 'base_fields': fields })
form = MyForm()

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

1 голос
/ 12 августа 2010

Учитывая, что вы включили пользователя в качестве параметра, я бы решил это с помощью пользовательского тега.

В вашем приложении / templatetags / custom_tags.py что-то вроде этого:

@register.simple_tag
def combo(user, another_param):
    objects = get_objects(user, another_param)
    str = '<select name="example" id="id_example">'
    for object in objects:
        str += '<option value="%s">%s</option>' % (object.id, object.name)
    str += '</select>'
    return mark_safe(str)

Тогда в вашем шаблоне:

{% load custom_tags %}
{% special_select user another_param %}

Подробнее о пользовательских тегах http://docs.djangoproject.com/en/dev/howto/custom-template-tags/

0 голосов
/ 03 марта 2011

Django создает динамические формы - это работает !!

Forms.py


class MyForm(forms.Form):

         """ Initialize form values from views"""

        select=forms.BooleanField(label='',required=False)

        field_1=forms.CharField(label='',widget=forms.TextInput(attrs= \

                    {'size':'20','readonly':'readonly',}))

        field_2=forms.ChoiceField(widget=forms.Select(), \

                    choices=((test.id,test.value) for test in test.objects.all()))



        def __init__(self, *args, **kwargs):

           super(MyForm, self).__init__(*args, **kwargs)

           input=kwargs.get('initial',{})

           get_field_1_initial_input_from_views=re.sub("\[|\]|u'|'","",str (input.values()))

           # override field_2 choices based on field_1 input

           try:

               # filter choices

               self.fields[‘field_2'].choices=((test.id,test.value) for test in test.objects.filter ( --------)))

           except:

               pass

Views.py


def views_function(request,val):

        """Dynamically generate input data for formset."""

        Initial_data=[]
        initial_data.append({'field_1':data.info})

        #Initializing formset

        MyFormSet=formset_factory(MyForm,extra=0)

        formset=MyFormSet(initial=initial_data)

        context={'formset':formset}

        if request.method == 'POST':

           formset=MyFormSet(request.POST,request.FILES)

           if formset.is_valid():

               # You can work with the formset dictionary elements in the views function (or) pass it to
               #Forms.py script through an instance of MyForm

               return HttpResponse(formset.cleaned_data)

       return render_to_response(‘test.html', context,context_instance=RequestContext(request))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...