2015-03-13 3 views
1

В моей форме у меня есть раскрывающийся список projects, который должен отображать некоторые элементы на основе определенного типа, используя ModelChoiceField. Этот запрос нуждается в некотором параметре, но как я могу передать этот параметр в форму?Параметры использования CreateView

class TaskCreate(CreateView): 
    model = Task 
    fields = ['name', 'description', 'project'] 

    def form_valid(self, form): 
     return super(TaskCreate, self).form_valid(form) 

\

class TaskcreateForm(forms.ModelForm): 
    projects = forms.ModelChoiceField(queryset=Project.objects.filter(type=someParameter)) 
    class Meta: 
     model = Task 

ответ

1

Вы можете переопределить get_form() метод представления. Например, если вы предоставите этот параметр через request.GET то вид будет выглядеть следующим образом:

class TaskCreate(CreateView): 
    ... 
    def get_form(self, form_class): 
     form = super(TaskCreate, self).get_form(form_class) 
     form.fields['project'].queryset = Project.objects.filter(
               type=self.request.GET['type']) 
     return form 

И в форме вы можете установить QuerySet в none(): ответ

class TaskcreateForm(forms.ModelForm): 
    projects = forms.ModelChoiceField(queryset=Project.objects.none()) 
    class Meta: 
     model = Task 
0

Catavaran является прямой. Другой вариант может быть, чтобы добавить тип к шаблону URL (непроверенный синтаксис)

url(r'^create/(?P<type>[-\w]+)/$', TaskCreate.as_view(), name='create_task') 

Таким образом, вы получите тип через kwargs, и вы по-прежнему иметь возможность создавать пользовательские ссылки на определенные типы, используя Обратный шаблон

{% url 'create_task' type='foo' %} 

Не забудьте, что есть шанс, что вы получите фиктивные входные данные из параметра GET.

2

Вы должны использовать метод get_form_kwargs представления:

class TaskCreate(CreateView): 
    model = Task 
    fields = ['name', 'description', 'project'] 

    def form_valid(self, form): 
     return super(TaskCreate, self).form_valid(form) 

    def get_form_kwargs(self): 
     """ 
     Returns the keyword arguments for instantiating the form. 
     """ 
     kwargs = super(TaskCreate, self).get_form_kwargs() 
     kwargs.update({'my_var': 'my value'}) 
     return kwargs 

А затем захватить этот параметр в методе формы __init__. Кроме того, необходимо установить QuerySet для поля в методе __init__:

class TaskcreateForm(forms.ModelForm): 
    projects = forms.ModelChoiceField(queryset=Project.objects.none()) 

    def __init__(self, *args, **kwargs): 
     self.my_var = kwargs.pop('my_var') 
     super(TaskcreateForm, self).__init__(*args, **kwargs) 
     self.fields['projects'].queryset = Project.objects.filter(type=self.my_var)) 

    class Meta: 
     model = Task 

Вы обязательно использование kwargs.pop() в противном случае вызов super() вызовет ошибку из-за неожиданный аргумент ключевого слова.

CCBV - отличный ресурс для подробного описания методов, доступных для всех общих представлений на основе классов.

+0

вы сделали некоторые опечатки. должен быть 'kwargs.update ({'my_var': 'my value'})', '__init__',' type = self.my_var) '. Но теперь получение '__init __() получило неожиданный аргумент ключевого слова' – FeedTheWeb

+0

Это неожиданное ключевое слово из-за того, что вы не сразу же выписали параметр в форме __init__, как я сказал в ответе. Спасибо за хедз-ап о опечатках, хотя пара из них связана с попыткой перехитрить автоматическое форматирование – hellsgate

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