如何使用django.forms添加额外字段到Textarea

3 投票
2 回答
7623 浏览
提问于 2025-04-16 07:07

我刚开始学习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/profiles/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 个回答

1

不建议直接修改像auth_user这样的django表格,不过为了让上面的内容正常工作,你需要在django.contrib.auth.models中修改认证模型,添加一个bio字段。

推荐的做法是通过UserProfile来实现,它和用户表之间有一对一的关系。

13

首先,正如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模型并不知道这个字段的存在。

撰写回答