2010-08-23 3 views
2

Теперь я могу создать все необходимые поля db в своих моделях.Форма, модель, модель

Я могу создавать формы для доступа к этим моделям.

И если я создаю формы из моделей:

http://docs.djangoproject.com/en/dev/topics/forms/modelforms/

Я не могу понять, почему я должен переопределить поля, подобные этим:

class AuthorForm(forms.Form): 
    name = forms.CharField(max_length=100) 
    title = forms.CharField(max_length=3, 
       widget=forms.Select(choices=TITLE_CHOICES)) 
    birth_date = forms.DateField(required=False) 

Почему я должен определить CharField здесь ? Я уже не делал этого в models.py?

Большое спасибо.

+0

-1 для того, чтобы не читать страницу документов, на которую вы действительно ссылаетесь. –

ответ

3

Опираясь на то, что gruszczy said, если у вас есть модель с именем Author вы можете объявить ModelForm для этой модели, таким образом:

class AuthorForm(forms.ModelForm): # Note the different superclass. 
    class Meta: 
     model = Author 

Если вы хотите форму, которая включает в себя всех атрибутов Author то, что все вам нужно сделать. Однако, если вам нужно только подмножество атрибутов Author (скажем name и title), то вы можете изменить форму модели, таким образом:

class AuthorForm(forms.ModelForm): # Note the different superclass. 
    class Meta: 
     model = Author 
     fields = ('name', 'title',) 

Обратите внимание, что вы не должны использовать CharField здесь.

Если с другой стороны, вы хотите все, кромеname и title, то вы можете определить форму, как это:

class AuthorForm(forms.ModelForm): # Note the different superclass. 
    class Meta: 
     model = Author 
     exclude = ('name', 'title',) 

Update

(После прочтения комментария) Вы можете обращаться AuthorFormany other regular form. По вашему мнению, вы можете создать эту форму с данными или без них на основе request.method. Что-то вроде этого:

def add_author(request, *args, **kwargs): 
    if request.method == 'GET': 
     form = AuthorForm() 

    elif request.method == 'POST': 
     form = AuthorForm(request.POST.copy()) 
     if form.is_valid(): 
      author = form.save() 
      # Redirect to listing etc. 

    context = dict(form = form) 
    return render_to_response(template_name, context) # etc. 

И в шаблоне:

{{ form.as_p }} 

Есть different ways для визуализации формы; as_p является лишь одним из них.

+0

+1 для четкого и краткого объяснения! – KillianDS

+0

Спасибо !. И как бы вставить эту «авторскую» форму в html-код? Еще раз спасибо, evry проницательный! – MacPython

+0

@MacPython: эту форму можно рассматривать как любую другую «форму». Вы можете создать эту форму из представления (с данными или без данных на основе метода запроса) и передать его вместе с шаблоном. В шаблоне вы можете отобразить форму, используя один из методов утилиты.Я обновил свой пост, чтобы продемонстрировать это. –

1

Вы используете forms.Form вместо forms.ModelForm и объявляете, какую модель вы используете (в: class Meta). Может, в этом и проблема. Не могли бы вы описать, для какой модели у вас возникла проблема?

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