【问题标题】:FieldError with keyword 'username' when trying to create a user with Django尝试使用 Django 创建用户时带有关键字“用户名”的 FieldError
【发布时间】:2012-04-22 08:28:32
【问题描述】:

我的 Models.py,这里我使用 OneToOneField 来扩展 StudentProfile。

from django.db import models 
from django.contrib.auth.models import User, UserManager


class SecretQuestion(models.Model):
    question = models.CharField(max_length=200)
    def __unicode__(self):
        return self.question


class StudentProfile(models.Model):
    user = models.OneToOneField(User)
    batch = models.CharField(max_length=10)
    course = models.CharField(max_length=20)
    date_of_birth = models.DateField()
    secret_question = models.ForeignKey(SecretQuestion)
    answer = models.CharField(max_length=20)
    contact = models.CharField(max_length=20)

在我的注册视图中,我正在创建新用户 main_user 并使用它来创建学生资料:-

def register_page(request):
    if request.method == 'POST':
        form = RegistrationForm(request.POST)
        if form.is_valid():
            main_user = User.objects.create_user(
              username= form.cleaned_data['username'],
              password = form.cleaned_data['password1'],
             )
            user = StudentProfile.objects.create(               
                user_id = main_user.id,http://stackoverflow.com/questions/ask
                batch=form.cleaned_data['batch'],
                course=form.cleaned_data['course'],
                date_of_birth=form.cleaned_data['date_of_birth'],
                secret_question=form.cleaned_data['secret_question'],
                answer=form.cleaned_data['answer'],
                contact=form.cleaned_data['contact']
              )
        return HttpResponseRedirect('/register/success/')
    else:
       form = RegistrationForm()

   variables = RequestContext(request, {'form': form})
   return render_to_response('registration/register.html',variables)

在 Django 中注册后,我得到了,

FieldError at /register/

Cannot resolve keyword 'username' into field. Choices are: answer, batch, contact, course, date_of_birth, id, secret_question, user

这是在填写注册字段并按下注册按钮后发生的。 我无法解释这个错误。这是什么意思?

【问题讨论】:

    标签: django django-registration django-users django-errors


    【解决方案1】:

    您需要按照Adding extra fields to django-registration form 中的说明对RegistrationForm 进行子类化


    User.objects.create_user 没有名为 username 的关键字参数。用户名必须是第一个位置参数:

            main_user = User.objects.create_user(form.cleaned_data['username'],
              password = form.cleaned_data['password1'],
             )
    

    以后,请至少包含发生错误的行号。

    【讨论】:

    • 我已经这样做了,但我仍然遇到同样的错误。即使我不知道发生了什么,因为如果我删除整个用户名代码(这部分 form.cleaned_data['username'])我仍然会遇到同样的错误,有什么线索吗?
    • @Jainit 嗯,看看我的编辑,特别是链接问题的second answer——这有帮助吗?
    • 它似乎会起作用,我有两个问题,有没有办法从 RegistrationForm 中排除电子邮件,以及在使用类 Meta 并从模型生成表单时,有没有办法在其中编写 quesryset一个字段,我想做这样的事情:- secret_question = forms.ModelChoiceField(queryset=SecretQuestion.objects.all())
    • @Jainit 您应该可以在表单的Meta 中执行exclude = ('email',)。即使使用模型,您也应该能够像在表单中那样指定secret_question。请参阅Creating forms from models 了解更多信息。
    • 非常感谢,错误已修复,我刚刚使用 RegistrationForm 扩展了我的表单,它工作了!但是,我需要删除数据库并重新创建它,没有它就无法工作
    【解决方案2】:

    当前代码不应导致此错误。

    该错误表明您正在通过 StudentProfile 类的 username 关键字参数进行过滤,根据您的模型,该类没有 username 字段。

    错误应该列出您的代码在哪一行中断,并准确告诉您发生这种情况的位置 - 这就是答案所在。你的代码? Django注册码?我不知道,直到你发布它。

    仅供参考,如果您尝试按无效字段过滤模型,则会出现此错误。

    MyModel.objects.filter(non_existent_field=True) # would throw this error.
    

    将无效字段传递给create 会导致TypeError

    【讨论】:

    • 他的代码确实会在form = RegistrationForm(request.POST) 行上导致此错误。使用 Django 获取行号有时会让人们感到困惑,因为他们没有得到正常的 Python 回溯。
    猜你喜欢
    • 2018-02-27
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 2013-04-15
    • 2023-03-15
    • 2021-01-21
    相关资源
    最近更新 更多