2010-11-16 103 views
2

我是django的新手,并且在一个pootle项目上工作。如何使用django.forms添加额外的字段Textarea

我想添加生物(在textarea),兴趣(textarea)和配置文件图片(图片上传)。这个页面看起来像这样: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})} 

和“”模板/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> 

但它不显示配置文件页面上的最后一个bio textarea字段。 无法加载form.bio。这里是html源代码:

<p> 
    <label for="id_email">Email address</label> 
    <input id="id_email" type="text" name="email" value="[email protected]" 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) 

可能有人看缺什么? 任何建议,非常感谢!

问候

+0

您是如何将bio添加到'User'模型的?它可能没有在Python中定义,这就是为什么你没有看到你的预期行为。最好的做法是使用'UserProfile'范例来处理这类事情。看到http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users – sdolan 2010-11-16 01:19:54

回答

12

首先,正如Digitalpbk所说,不要手动将列添加到Django的表中。相反,在您自己的应用程序中创建一个UserProfile模型,其OneToOneField为auth.User

其次,额外的字段添加到的ModelForm,你需要在形式层面明确定义他们:

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')     

最后,你需要手动做一些在你看来,以节省这些额外的领域,因为用户模型不知道它。

+0

嗨,丹尼尔,它现在显示了textarea!但还有一个问题。它不会将它保存到数据库..我缺少什么保存额外的字段数据库?非常感谢你的建议! – 2010-11-20 00:04:06

1

不建议直接修改Django的表像AUTH_USER尽管上述工作,你将不得不改变身份验证模型django.contrib.auth.models添加生物领域。

推荐的做事方式是通过与用户表具有OneToOne关系的UserProfile。

相关问题