电子邮件已保存到who-know-where,未找到任何关系

时间:2014-05-24 21:48:43

标签: django postgresql

我在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 %}

我回忆起可能有两个相关的问题:

  1. 当我运行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
    
  2. This Stack Overflow thread建议我从我的数据库中删除已存在的表,但是当我进入psql shell(我使用9.2)并输入\ d或\ dt db_chishenma(数据库名称)时),它说,“找不到关系”/“找不到匹配关系”,即使\ list返回包含我的数据库(db_chishenma)的列表。

  3. 似乎我的数据库出现了问题。显然存在数据库,但如何访问它并删除chishenma_app_category表?这会解决丢失电子邮件地址的问题吗?

2 个答案:

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

新秀的错误造成了一个看起来比以前复杂得多的问题!