【问题标题】:It's not saving value into database table, why?它没有将值保存到数据库表中,为什么?
【发布时间】:2012-02-10 12:25:19
【问题描述】:
def register(request):
    flag = True
    possible = '0123456789abcdefghijklmnopqrstuvwxyz'
    token = ''
    length = 10
    i = 0

    current_datetime = datetime.datetime.now()

    user = UsersModelForm()
    if request.method == 'POST':
        userf = UsersModelForm(request.POST)
        username = userf.data['username']
        password = userf.data['password']
        passwordrepeat = userf.data['passwordrepeat']
        email = userf.data['email']

        if password != passwordrepeat:
            flag = False
            passVariable = {'user':user, 'flag': False}
            return render_to_response('register.html', passVariable, context_instance=RequestContext(request))

        elif password == passwordrepeat:
            for i in range(1,10):
                temp = random.choice(possible)
                token = token + temp

            print token
            userf.email_token = token
            userf.email_token_expiry = current_datetime + timedelta(1)
            if userf.is_valid():
                check = userf.save()
            return HttpResponseRedirect('/')

userf.save() 正在插入一行,但它没有保存 email_token、email_token_expiry,它只是插入用户名、密码、电子邮件和 models.py 中的默认值。

models.py:

class Users(models.Model):
    username = models.CharField(max_length=255)
    slug = models.CharField(max_length=255, default='0')
    password = models.CharField(max_length=300)
    passwordrepeat = models.CharField('Repeat Password', max_length=300)
    password_token = models.CharField(max_length=300, default='0')
    email = models.CharField(max_length=255)
    email_verified = models.BooleanField(default=False)
    email_token = models.CharField(max_length=255)
    email_token_expiry = models.DateTimeField(auto_now_add=True)
    tos = models.BooleanField(default=False)
    active = models.BooleanField(default=False)
    last_login = models.DateTimeField(auto_now_add=True)
    last_action = models.DateTimeField(auto_now_add=True)
    is_admin = models.BooleanField(default=False)
    role = models.CharField(max_length=255, default='0')
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now_add=True)

    def __unicode__(self):
        return self.username

class UsersModelForm(forms.ModelForm):
    class Meta:
        model = Users
        fields = ('username', 'password', 'passwordrepeat', 'email')
        widgets = {
            'password' : PasswordInput(),
            'passwordrepeat' : PasswordInput(),
        }

有人可以帮我解决这个问题吗?为什么不将值保存到其他字段?

【问题讨论】:

  • 1.您还没有阅读有关模型表单的文档。 2. 您仍在尝试将密码明文保存在数据库中。

标签: python database django forms django-models


【解决方案1】:

它只是为您在fields 中指定的字段插入值。将 email_token、email_token_expiry 添加到该列表中,这些也将保存到数据库中。

编辑:哎呀,是的。改为这样做:

check = userf.save(commit=False)
check.email_token = token
check.email_token_expiry = current_datetime + timedelta(1)
check.save()

表单对象不会保存附加的附加信息 (AFAIK)。您需要从 save() 取回对象,然后分配这些值。 commit=False 阻止表单保存到数据库。然后添加所需的额外信息并保存对象。

【讨论】:

  • 不,如果您在字段数组中添加email_tokenemail_token_expiry{{ form }} 也会在模板中显示这些文本框。
  • 提交表单后出现错误,IntegrityError at /register (1048, "Column 'email_token_expiry' cannot be null")pastebin.com/LxzY5Vs6
  • 仍然没有保存令牌,这是一个了不起的问题。 pastebin.com/duNJZWjz
  • @Tom,你的代码有问题,应该是check.email_tokencheck.email_token_expiry
  • 啊天哪,这就是我在看足球时编辑得到的。对不起。
【解决方案2】:

试试这个:

        if userf.is_valid():
            user = userf.save(commit=False)
            user.email_token = token
            user.email_token_expiry = current_datetime + timedelta(1)
            user.save()

【讨论】:

  • 为什么一定要用这种方式?正常的userf.save()方式有什么问题?
  • userf 实际上是UserModelForm 的一个实例,而不是Users 的一个实例。如果您真的想将其分配给userf,您应该分配给userf.data['email_token'],我认为这会起作用,但我不确定。我会按照自己的方式去做。
  • 提交表单后出现错误,IntegrityError at /register (1048, "Column 'email_token_expiry' cannot be null")pastebin.com/LxzY5Vs6
  • 仍然没有保存令牌,这是一个了不起的问题。
  • 那个代码和我给你的代码不对应。您需要分配给check.email_token,而不是userf.email_token
猜你喜欢
  • 2016-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-02
  • 2020-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多