我在Django应用程序上注册时遇到了问题,但我终于成功发布了两个要求用户名,密码,密码确认,城市和电子邮件地址的表单。当我进入Django管理页面时,我可以看到已创建自定义用户,但缺少电子邮件字段。我已经多次运行syncdb了,所以我认为已经处理了,所以问题是什么?
以下是forms.py:
的扩展表单class UserWaitlistForm(forms.Form):
user_city = forms.CharField(max_length=25, required=True)
user_email = forms.EmailField(max_length=35)
fields = ('user_city,' 'user_email')
这是来自views.py的注册视图:
@atomic
def register(request):
user_form = UserCreationForm()
user_waitlist_form = UserWaitlistForm()
if request.method == 'POST':
user_form = UserCreationForm(request.POST)
user_waitlist_form = UserWaitlistForm(request.POST)
if user_form.is_valid() and user_waitlist_form.is_valid():
new_user = user_form.save()
Foodie.objects.create(user_wechat=new_user, user_email=user_waitlist_form['user_email'].value(), user_city=user_waitlist_form['user_city'].value())
return redirect(reverse('home'))
return render(request, "registration/register.html", {
'user_form': user_form,
'user_waitlist_form': user_waitlist_form,
})
以下是来自models.py的扩展用户模型:
class Foodie(models.Model):
user_wechat = models.OneToOneField(User)
user_city = models.CharField(max_length=25)
user_waitlist_status = models.BooleanField(default=False)
user_waitlist_num = models.IntegerField(blank=True, default=0)
user_num_referrals = models.IntegerField(blank=True, default=0)
user_email = models.EmailField()
USERNAME_FIELD = 'user_wechat'
def __unicode__(self):
return self.user_wechat.username
这是我的register.html:
{% extends "base.html" %}
{% load staticfiles %}
{% block title %}Create an account{% endblock %}
{% block content %}
<div data-role="page" id="register" data-theme="a">
<div data-role="header" data-position="fixed" style="background-color:#EEEEEE;" data-tap-toggle="false" data-add-back-btn="true">
<h1>Register</h1>
</div><!-- /header -->
<h1>Create an account</h1>
<form action="" method="post">
{{ user_form.as_p }}
{{ user_waitlist_form.as_p }}
<input type="submit" value="Create an account"/>
{% csrf_token %}
</form>
{% endblock %}
我回忆起可能有两个相关的问题:
当我运行python manage.py migrate时,我得到了 'django.db.utils.ProgrammingError:relation“chishenma_app_category” 已经存在,'所以我用--fake再次运行它,这看起来很好。类别模型不是注册表的一部分,所以也许这个问题实际上并不相关。不过,以下是类别模型:
class Category(models.Model):
category_label = models.CharField(max_length=200)
category_img = models.ImageField(upload_to='images/', null=True, blank=True)
category_tag = models.CharField(max_length=200, blank=True)
def __unicode__(self):
return self.category_label
This Stack Overflow thread建议我从我的数据库中删除已存在的表,但是当我进入psql shell(我使用9.2)并输入\ d或\ dt db_chishenma(数据库名称)时),它说,“找不到关系”/“找不到匹配关系”,即使\ list返回包含我的数据库(db_chishenma)的列表。
似乎我的数据库出现了问题。显然存在数据库,但如何访问它并删除chishenma_app_category表?这会解决丢失电子邮件地址的问题吗?
答案 0 :(得分:1)
关于您对psql
的使用,命令\dt db_chishenma
会查找名为 db_chishenma 的表,这就是您获得No relations found
的原因。 1}}错误。
您可以通过将cmdline指定为最后一个参数来直接连接到db,即
psql -h <host> -U <user> -p <port> <dbname>
或者您可以使用\c db_chishenma
从psql中连接到该数据库(如果您连接到同一服务器上的另一个数据库)。
我通常使用from-the-cmdline方法。
连接到该数据库后,您希望列出您的表:\dt chishenma_app_category
,该表应该在连接到数据库后找到,因为错误已经存在。
然后,您可以运行此SQL
来删除表格:
DROP TABLE chishenma_app_category; COMMIT;
只有在您未启用COMMIT
时才需要auto-commit
。
根据OP的评论进行编辑:
重新同步后,电子邮件字段是否实际上已添加到Postgres
中的表格中了?
此外,您可能希望在执行同步时尝试增加verbosity
,以查看是否会产生任何额外信息。这是通过选项--verbosity 2
完成的。你可以将其调高到3以获得更多信息。
听起来South
可能与数据库不同步。根据增加的详细程度所表示的内容,建议您遵循关于South
迁移文件和历史记录所链接的故障单中的其他步骤。
答案 1 :(得分:0)
根据Ken的建议,我使用了&#34; psql -h localhost -U michelleglauser db_chishenma&#34;进入psql shell,然后\ dt来查看我的表。
我使用&#34; SELECT * FROM chishenma_app_foodie查看了Foodie模型(我的扩展用户模型);&#34;并且看到用户电子邮件实际上已包含在那里,尽管它不在管理GUI中。我还将auth_user表(使用&#34; SELECT * FROM auth_user;&#34;)与管理GUI进行了比较,发现两者都有空的电子邮件字段,因此似乎只有Foodie模型关闭了。在挖掘之后,我意识到我必须做的所有事情(!)都添加了“user_email”#39; to admin_py中的list_display,以便已成功保存的电子邮件地址将显示在Foodie的管理GUI中。完整行现在完全与psql表对齐,如下所示:
list_display = ('user_wechat', 'user_city', 'user_waitlist_status', 'user_waitlist_num', 'user_num_referrals', 'user_email')
新秀的错误造成了一个看起来比以前复杂得多的问题!