2015-03-13 2 views
1

У меня есть мнение, что наследуется от общего CreateView и имеет приоритет над get_initial метода следующим образом:Джанго родового создать значение вида по умолчанию для поля выбора модели

class PosterVisualCreateView (ModelFormMixin, generic.edit.CreateView, ObjectClassContextMixin): 
    model = Poster 
    valid_message = "Successfully created object." 
    template_name = "poser/create_poster_visual.html" 

    def get_form_class (self): 
     return super(PosterVisualCreateView, self).get_form_class(extra="CreateVisual") 

    def get_form_kwargs (self): 
     kwargs = super(PosterVisualCreateView, self).get_form_kwargs() 

     kwargs.update({ 
      "company": self.request.company 
     }) 
     return kwargs 

    def get_context_data (self, **kwargs): 
     context = super(PosterVisualCreateView, self).get_context_data(**kwargs) 
     context.update({ 
      "company": self.request.company, 
     }) 
     return context 

    def get_initial (self): 
     initial = super(PosterVisualCreateView, self).get_initial() 
     initial.update({ 
      "company": self.request.company, 
      "template": self.request.company.template_set.all().first() 
     }) 
     return initial 

    def form_valid(self, form): 
     success_url = super(PosterVisualCreateView, self).form_valid(form) 
     attributes = form.instance.create_attributes() 
     for attribute in attributes: 
      attribute.poster = form.instance 
      attribute.save() 
     form.instance.save() 
     form.instance.render_html(commit=True) 
     form.instance.save() 
     return success_url 

    @method_decorator(login_required) 
    def dispatch (self, *args, **kwargs): 
     return super(PosterVisualCreateView, self).dispatch(*args, **kwargs) 

страница, оказывает эту форму:

class PosterFormCreateVisual (CompanyHiddenForm): 
    """Create form for Posters.""" 
    template = fields.ModelChoiceField(widget=forms.RadioSelect, queryset=Template.objects.all()) 
    product = fields.ModelChoiceField(widget=forms.Select, queryset=Product.objects.all(), 
     required=False) 

    class Meta: 
     model = Poster 
     fields = ("template", "product", "company") 

    def __init__ (self, *args, **kwargs): 
     company = kwargs.pop("company", None) 
     assert company is not None, "Company is required to create attribute form." 
     super(PosterFormCreateVisual, self).__init__(*args, **kwargs) 
     self.fields["template"].queryset = company.template_set.all() 
     self.fields["product"].queryset = company.product_set.all() 

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

+0

Попробуйте шаблон ': Template.objects.all() [0]' in 'get_initial' – Ghopper21

+0

Не все шаблоны принадлежат текущей компании, поэтому не хотите, чтобы первый шаблон из всех шаблонов в системе выбран как по умолчанию, поскольку он может не принадлежать пользователю. –

+0

Я вижу. Вы пробовали без «.id», установив его только на объект модели? Прошло некоторое время с тех пор, как я использовал get_initial, но я думаю, что вы не захотите использовать идентификатор. – Ghopper21

ответ

0

Попробуйте это:

"template": self.request.company.template_set.all().first() 

Но, насколько я понимаю вас исходный код должен работать тоже.

BTW, как вы протестировали форму? Путем нажатия кнопки «Обновить» или Ctrl-R/F5 ключ? Некоторые браузеры перезагружают страницу, но сохраняют ранее выбранные/введенные значения формы. Чтобы проверить начальные значения, вы должны перезагрузить страницу формы, нажав на адресную строку (или нажав Ctrl-L), а затем нажав клавишу Enter.

+0

Не повезло с первым() –

+0

Я тестировал его с образцом модели/формы, и он отлично работает. Обновите вопрос с полным кодом вида и шаблона, пожалуйста. – catavaran

+0

добавлен полный код просмотра –

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

  • Нет связанных вопросов^_^