Как добавить дополнительные поля, используя django.forms Textarea - PullRequest
2 голосов
/ 16 ноября 2010

Я новичок в django и работаю над проектом pootle.

Я хотел бы добавить биографию (в текстовом поле), интересы (текстовое поле) и фотографии профиля (загрузка изображений).эта страница выглядит так: http://pootle.locamotion.org/accounts/personal/edit/ (вам может потребоваться войти, чтобы увидеть эту страницу)

Я отредактировал local_apps / pootle_profile / views.py, который выглядит следующим образом:

from django.forms import ModelForm, Textarea 

class UserForm(ModelForm):                                                    
    class Meta:                                                               
        model = User                                                          
        fields = ('first_name', 'last_name', 'email', 'bio')                  
        widgets = {'bio': Textarea(attrs={'cols': 80, 'rows': 20})}  

и в "" templates / profile / edit_personal.html ""

<form method="post" action="/accounts/{{user.username}}/">                    
    <p> 
        <label for="id_first_name">{% trans 'First Name' %}</label>           
        {{ form.first_name }}                                                 
        {{ form.first_name.errors }}
    </p>
    <p> 
        <label for="id_last_name">{% trans 'Last Name' %}</label>             
        {{ form.last_name }}
        {{ form.last_name.errors }}
    </p>
    <p>
        <label for="id_email">{% trans 'Email address' %}</label>
        {{ form.email }}
        {{ form.email.errors }}
    </p>
    <p>
        <label for="id_bio">{% trans 'Bio' %}</label>
        {{ form.bio }}                                                        
        {{ form.bio.errors }}
    </p>                                                                      
    <p class="common-buttons-block">
        <input type="submit" class="save" value="{% trans 'Save' %}" />       
    </p>                                                                      
</form>

, но оно не отображает последнее поле био текстовой области на странице профиля.не загружается form.bio.Вот источник HTML:

<p>
    <label for="id_email">Email address</label>
    <input id="id_email" type="text" name="email" value="sample@email.com" maxlength="75" />
</p>
<p>
    <label for="id_bio">Bio</label>
</p>

Я добавил био-столбец в auth_user:

MariaDB [pootle]> describe auth_user;
+--------------+--------------+------+-----+---------+----------------+
| Field        | Type         | Null | Key | Default | Extra          |
+--------------+--------------+------+-----+---------+----------------+
| id           | int(11)      | NO   | PRI | NULL    | auto_increment |
| username     | varchar(30)  | NO   | UNI | NULL    |                |
| first_name   | varchar(30)  | NO   |     | NULL    |                |
| last_name    | varchar(30)  | NO   |     | NULL    |                |
| email        | varchar(75)  | NO   |     | NULL    |                |
| password     | varchar(128) | NO   |     | NULL    |                |
| is_staff     | tinyint(1)   | NO   |     | NULL    |                |
| is_active    | tinyint(1)   | NO   |     | NULL    |                |
| is_superuser | tinyint(1)   | NO   |     | NULL    |                |
| last_login   | datetime     | NO   |     | NULL    |                |
| date_joined  | datetime     | NO   |     | NULL    |                |
| bio          | text         | YES  |     | NULL    |                |
+--------------+--------------+------+-----+---------+----------------+
12 rows in set (0.00 sec)

Может кто-нибудь увидеть, чего не хватает?Любые предложения приветствуются !!

С уважением

Ответы [ 2 ]

12 голосов
/ 16 ноября 2010

Во-первых, как говорит Digitalpbk, не добавляйте столбцы в таблицы Django вручную.Вместо этого создайте модель UserProfile в своем собственном приложении с OneToOneField для auth.User.

Во-вторых, чтобы добавить дополнительные поля в форму модели, вам необходимо явно определить их на уровне формы:

class UserForm(ModelForm):                                                    
    bio = forms.CharField(widget=forms.Textarea(attrs={'cols': 80, 'rows': 20}))
    class Meta:                                                               
        model = User                                                          
        fields = ('first_name', 'last_name', 'email', 'bio')                  

Наконец, вам нужно что-то сделать в своем представлении вручную, чтобы сохранить это дополнительное поле, так как модель User об этом не знает.

1 голос
/ 16 ноября 2010

Не рекомендуется напрямую изменять таблицы django, такие как auth_user, хотя для того, чтобы вышеперечисленное работало, вам нужно изменить модель auth в django.contrib.auth.models, чтобы добавить поле био.

Рекомендованный способ работы - через UserProfile, который имеет отношение OneToOne с таблицей пользователей.

...