2017-07-29 38 views
0

试图为我的网站创建一个简单的启动页面来收集电子邮件地址。当用户提交时,它提供以下错误(下面的追踪) - 唯一约束失败--- accounts.user.username。我想这可能与输入的电子邮件地址与用户名重叠有关,但正如您在我的账户模型中所看到的 - 用户名是通过电子邮件创建的。 (请注意,整个用户和用户个人资料模型尚未在我的网站中使用,但仅为将来的使用做准备)。任何帮助表示赞赏。由于Django完整性错误 - 唯一约束失败

Traceback (most recent call last): 
    File "C:\Users\crstu\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\handlers\base.py", line 149, in get_response 
    response = self.process_exception_by_middleware(e, request) 
    File "C:\Users\crstu\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\handlers\base.py", line 147, in get_response 
    response = wrapped_callback(request, *callback_args, **callback_kwargs) 
    File "C:\Users\crstu\PycharmProjects\dealmazing\dealmazing\views.py", line 15, in newsletter_signup 
    instance.save() 
    File "C:\Users\crstu\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\contrib\auth\base_user.py", line 74, in save 
    super(AbstractBaseUser, self).save(*args, **kwargs) 
    File "C:\Users\crstu\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\base.py", line 708, in save 
    force_update=force_update, update_fields=update_fields) 
    File "C:\Users\crstu\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\base.py", line 736, in save_base 
    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields) 
    File "C:\Users\crstu\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\base.py", line 820, in _save_table 
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw) 
    File "C:\Users\crstu\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\base.py", line 859, in _do_insert 
    using=using, raw=raw) 
    File "C:\Users\crstu\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\manager.py", line 122, in manager_method 
    return getattr(self.get_queryset(), name)(*args, **kwargs) 
    File "C:\Users\crstu\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\query.py", line 1039, in _insert 
    return query.get_compiler(using=using).execute_sql(return_id) 
    File "C:\Users\crstu\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\sql\compiler.py", line 1060, in execute_sql 
    cursor.execute(sql, params) 
    File "C:\Users\crstu\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\backends\utils.py", line 79, in execute 
    return super(CursorDebugWrapper, self).execute(sql, params) 
    File "C:\Users\crstu\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\backends\utils.py", line 64, in execute 
    return self.cursor.execute(sql, params) 
    File "C:\Users\crstu\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\utils.py", line 95, in __exit__ 
    six.reraise(dj_exc_type, dj_exc_value, traceback) 
    File "C:\Users\crstu\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\utils\six.py", line 685, in reraise 
    raise value.with_traceback(tb) 
    File "C:\Users\crstu\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\backends\utils.py", line 64, in execute 
    return self.cursor.execute(sql, params) 
    File "C:\Users\crstu\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\backends\sqlite3\base.py", line 323, in execute 
    return Database.Cursor.execute(self, query, params) 
django.db.utils.IntegrityError: UNIQUE constraint failed: accounts_user.username 

我的帐户的应用程序如下模式:

from django.contrib.auth.models import (
    AbstractBaseUser, 
    BaseUserManager, 
    PermissionsMixin 
) 
from django.db import models 
from django.utils import timezone 
from django.conf import settings 
from django.db.models.signals import post_save 
import os 


def avatar_upload_path(instance, filename): 
    return os.path.join('avatars', 'user_{0}', '{1}').format(
     instance.user.id, filename) 


class UserManager(BaseUserManager): 
    def create_user(self, email, username=None, password=None): 
     if not email: 
      raise ValueError("Users must have an email address") 

     if not username: 
      username = email.split('@')[0] 

     user = self.model(
      email=self.normalize_email(email), 
      username=username, 
     ) 
     user.set_password(password) 
     user.save() 
     return user 

    def create_superuser(self, email, username, password): 
     user = self.create_user(
      email, 
      username, 
      password, 
     ) 
     user.is_staff = True 
     user.is_superuser = True 
     user.save() 
     return user 


class User(AbstractBaseUser, PermissionsMixin): 
    email = models.EmailField(unique=True) 
    username = models.CharField(max_length=40, unique=True, default='') 
    date_joined = models.DateTimeField(default=timezone.now) 
    is_active = models.BooleanField(default=True) 
    is_staff = models.BooleanField(default=False) 

    objects = UserManager() 

    USERNAME_FIELD = 'email' 
    REQUIRED_FIELDS = ['username'] 

    def __str__(self): 
     return "@{}".format(self.username) 

    def get_short_name(self): 
     return self.username 

    def get_long_name(self): 
     return "@{} ({})".format(self.username, self.email) 


class UserProfile(models.Model): 
    user = models.OneToOneField(settings.AUTH_USER_MODEL, primary_key=True, related_name='profile') 
    first_name = models.CharField(max_length=40, default='', blank=True) 
    last_name = models.CharField(max_length=40, default='', blank=True) 
    bio = models.TextField(blank=True, default='') 
    avatar = models.ImageField('Avatar picture', 
           upload_to=avatar_upload_path, 
           null=True, 
           blank=True) 

    def __str__(self): 
     return self.user.username 

    @property 
    def get_avatar_url(self): 
     if self.avatar: 
      return '/media/{}'.format(self.avatar) 
     return 'http://www.gravatar.com/avatar/{}?s=128&d=identicon'.format(
      '94d093eda664addd6e450d7e9881bcad' 
     ) 


def create_profile(sender, **kwargs): 
    if kwargs['created']: 
     user_profile = UserProfile.objects.create(user=kwargs['instance']) 

post_save.connect(create_profile, sender=User) 

,这里是我所收集电子邮件地址,实际通讯的看法。请注意我只是暂时重定向现在谷歌作为一个测试:

from django.shortcuts import render, redirect 
from newsletters.forms import NewsletterUserSignUpForm 
from accounts.models import User 


def newsletter_signup(request): 
    if request.method == "POST": 
     form = NewsletterUserSignUpForm(request.POST) 

     if form.is_valid(): 
      instance = form.save(commit=False) 
      if User.objects.filter(email=instance.email).exists(): 
       print("Sorry this email already exists") 
      else: 
       instance.save() 
       return redirect("http://www.google.com") 

    else: 
     form = NewsletterUserSignUpForm() 

    template = "newsletters/sign_up.html" 
    return render(request, template, {'form': form}) 

注册的HTML表单如下:

<div class="col-lg-6 offset-lg-3"> 
     <form method="POST"> 
     {% csrf_token %} 
     <div class="form-group"> 
      <div class="col-xs-6 col-xs-offset-3"> 
      {{ form.email}} 
     <button class="btn btn-primary" type="submit">Sign Up!</button> 
      </div> 
     </div> 
     </form> 
     </div> 
    </div> 

回答

1

User模型用户名字段需要unique=True这是你的问题的原因。现在你可能会有一个用户名为''的用户名字段,这是默认的。由于您已拥有一位拥有此用户名的用户,因此您无法让其他用户使用此字段。你应该检查该用户已经存在于数据库中,或者你不得不向用户输入一些用户名,不要使用default with unique = True,这是一个非常糟糕的设计,总是失败。

+0

好的我认为你肯定是在这条正确的道路上。数据库中已经有两个用户 - 一个是超级用户,另一个用户名是默认的用户名。当我用空白的用户名输入这个用户的用户名时,表单工作。所以,我删除了默认值=''但是当我在表单中输入一个新的用户电子邮件时,问题不断发生。我是否需要将用户名设置为注册表单视图中的电子邮件地址? –

+0

您必须在表格中输入用户名字段,并在保存用户存在与否之前进行检查。如果可能会发现用户名已经以dB为单位存在,也不要使用户名不在电子邮件中。从用户名采取用户名,并检查它是否存在,如果它不存在然后继续创建用户 –

+0

我唯一的问题是,我只是试图创建一个临时通讯注册表单 - 唯一的输入会是电子邮件,所以不会从用户那里收集用户名。 –

2

因为您正在使用username = email.split('@')[0]获取用户的用户名。有可能两个不同的电子邮件会为您提供username的相同值。例如[email protected][email protected]。你需要做的是找出一些其他的算法来设置username或者一个好主意可以是将用户email作为用户名。

+0

电子邮件的好用户名。这就是我总是做什么.. –

+0

我不认为这是问题 - 因为我已经多次测试它与许多不同的电子邮件,并仍然得到同样的错误的一切 –

相关问题