【发布时间】:2015-05-11 04:07:31
【问题描述】:
我正在尝试为我正在开发的 Django 应用程序实现用户帐户。我目前能够以管理员身份创建用户帐户,但我想要一个表单,以便用户可以为自己创建一个帐户。我确实有一个表单视图来尝试这样做,但是当我点击提交时,数据不会写入数据库。我得到类似"[09/May/2015 20:41:00] "POST /createuser/ HTTP/1.1" 200 3175"... 的东西,它似乎应该发布。
我在 Django 1.7.6 中。我的工作基于this 博客。
我的问题:当我尝试从公共视图创建用户帐户时,为什么我的数据没有写入数据库?
以下是相关部分:
models.py
class AuthUserManager(BaseUserManager):
def create_user(self, username, email, password=None):
if not email:
raise ValueError('Users must have an email address')
if not username:
raise ValueError('Users must have a username')
user = self.model(username=username, email=self.normalize_email(email),
)
user.is_active = True
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, username, email, password):
user = self.create_user(username=username, email=email, password=password)
user.is_staff = True
user.is_superuser = True
user.save(using=self._db)
return user
class AuthUser(AbstractBaseUser, PermissionsMixin):
alphanumeric = RegexValidator(r'^[0-9a-zA-Z]*$', message='Only alphanumeric characters are allowed.')
### Redefine the basic fields that would normally be defined in User ###
username = models.CharField(unique=True, max_length=20, validators=[alphanumeric])
email = models.EmailField(verbose_name='email address', unique=True, max_length=255)
first_name = models.CharField(max_length=30, null=True, blank=True)
last_name = models.CharField(max_length=50, null=True, blank=True)
date_joined = models.DateTimeField(auto_now_add=True)
is_active = models.BooleanField(default=True, null=False)
is_staff = models.BooleanField(default=False, null=False)
### Our own fields ###
profile_image = models.ImageField(upload_to="uploads", blank=False, null=False, default="/static/images/defaultuserimage.png")
user_bio = models.CharField(max_length=600, blank=True)
objects = AuthUserManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username']
def get_full_name(self):
fullname = self.first_name+" "+self.last_name
return fullname
def get_short_name(self):
return self.username
def __unicode__(self):
return self.email
forms.py
class AuthUserForm(UserCreationForm):
class Meta:
model = AuthUser
fields = ['username', 'email', 'first_name', 'last_name', \
'password','user_bio']
views.py
def AuthUserView(request):
if request.method == 'POST':
form = AuthUserForm(request.POST)
if form.is_valid():
username = form.cleaned_data['username']
email = form.cleaned_data['email']
first_name = form.cleaned_data['first_name']
last_name = form.cleaned_data['last_name']
password1 = form.cleaned_data['password1']
password2 = form.cleaned_data['password2']
user_bio = form.cleaned_data['user_bio']
authuser_obj = AuthUser(username = username,
email = email,
first_name = first_name,
last_name = last_name,
password1 = password1,
password2 = password2,
user_bio = user_bio
)
authuser_obj.save()
return render_to_response('recipes/name.html', RequestContext(request))
else:
form = AuthUserForm()
return render(request, 'recipes/name.html',
{'form' : form})
name.html
<form action="/createuser/" method="post">
{% csrf_token %}
<h2>Create your account here!</h2>
<div class="form-group">
<div class="col-sm-8">
<label for="first_name" class="col-sm-6">First Name</label>
<input type="text" class="form-control" name="first_name" id="first_name"
placeholder="First Name">
</br>
<label for="last_name" class="col-sm-6">Last Name</label>
<input type="text" class="form-control" name="last_name" id="last_name"
placeholder="Last Name">
</br>
<label for="username" class="col-sm-6">Username</label>
<input type="text" class="form-control" name="username" id="username"
placeholder="User Name">
</br>
<label for="email" class="col-sm-6">Email</label>
<input type="text" class="form-control" name="email" id="email"
placeholder="Email">
</br>
<label for="password1" class="col-sm-6">Password</label>
<input type="text" class="form-control" name="password1" id="password1"
placeholder="Keep it to just numbers and letters">
</br>
<label for="password2" class="col-sm-6">Enter your password again</label>
<input type="text" class="form-control" name="password2" id="password2"
placeholder="Just to double check">
</br>
<label for="user_bio" class="col-sm-6">Care to share a bio?</label>
<input type="text" class="form-control" name="user_bio" id="user_bio"
placeholder="Write a bit about yourself!">
</br>
<div class="col-sm-offset-3 col-sm-1">
<button type="submit" class="btn btn-warning" name="submit" id="submit">Submit</button>
</div>
</div>
<a><img src="/static/recipes/images/beet4flipped.png" align="right" ></a>
</div>
</div>
</form>
【问题讨论】:
-
你不应该在保存时重新渲染相同的模板,你应该重定向。我想如果你这样做了,你实际上不会被重定向,因为表单可能是无效的。您是否在表单模板上显示错误?
-
另外,在您的经理中仔细定义了
create_user视图,您实际上并没有使用它们;这意味着您正在尝试将原始密码保存到数据库中,这意味着您的新用户将永远无法登录。 -
不,我没有在任何地方显示错误;我什至得到表明一切都正确发布的输出。关于重定向到同一个表单的好点...如果成功,我将重定向到另一个页面。
-
什么输出?您应该在此处显示模板。
-
啊,好的。那一定是我困惑的根源。我看到我没有在 forms.py 或 views.py 中的任何地方显式导入 AuthUserManager,但我不知道该放在哪里。