Как добавить в форму в представлениях с Django? - PullRequest
0 голосов
/ 26 мая 2011

Я отправил обратно форму, и в моем представлении я хотел бы добавить поле.

Редактирование поля slug . Это поле slug, которое я решил скрыть в форме и автоматически сгенерировать в виде. Как я могу добавить поле формы в форму?

if form.is_valid():            
    form.[want_to_add_slug_field_here] = slugify(form.cleaned_data['title'])
    form.save()

Я использую (это для того, чтобы полностью скрыть поля от внешних пользователей, так как я хочу их автоматизировать.

class LinkForm(forms.ModelForm):
    class Meta:
        model = Link
        exclude = ('pub_date', 'slug', 'posted_by',)

Значит, эти поля не находятся в моей форме, когда они генерируются. Я хочу добавить эти поля в форму перед сохранением. Это вообще возможно?

Ответы [ 3 ]

1 голос
/ 26 мая 2011

Есть много способов справиться с этим (я полагаю, вы используете ModelForm):

  1. Использовать метод clean формы:

    class MyForm(forms.models.ModelForm):
        """ This is a form for your model. It includes all fields, but you
            won't display the slug field to the user. """
    
        def clean(self):
            cleaned_data = self.cleaned_data
            cleaned_data["slug"] = slugify(form.cleaned_data["title"])
            return cleaned_data
    
  2. Добавьте слаг к модели перед совершением:

    if form.is_valid():
         instance = form.save(commit=False)
         instance.slug = slugify(form.cleaned_data["title"])
         instance.save()
    
  3. Переопределите метод сохранения вашей модели:

    class MyModel(models.Model):
    
        def save(self, *args, **kwargs):
             self.slug = slugify(self.title)
             return super(MyModel, self).save(*args, **kwargs)
    
  4. Используйте aПоле autoslug стороннего производителя, например django-autoslug

Я лично использую 4-й способ.

0 голосов
/ 26 мая 2011

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

Если вы регулярно разбиваете поля на нескольких моделях, вы можете также написать оболочку для функции slugify, которую можно вызвать с помощью сигнала pre_save .

0 голосов
/ 26 мая 2011

Вы ищете:

Значение по умолчанию при отображении формы:

form.fields['slug_field'].initial = slugify(form.fields['title'].value)

Значение по умолчанию без ввода данных пользователем, когда-либо: Вам необходимо переопределить метод сохранения для модели :

def save(self,*args,**kwargs):
    self.slug_name = slugify(self.title)
    return super(MyModel,self).save(*args,**kwargs)
...