- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建一个视频博客,用户可以在其中创建自己的帐户和个人资料。我还添加了用于注册的电子邮件验证。但问题是当我尝试使用 Django 2.2.5 开发服务器注册新用户时出现此错误(“重复键值违反唯一约束”“account_profile_mobile_number_key”详细信息: key (移动编号)=()已经存在。 ) 重复。我想如果我删除数据库这可能会解决问题。我删除了数据库并创建了另一个数据库。然后我已经能够创建一个用户,但再次出现该问题。我再次删除了数据库。这样,我试了很多次都无法解决问题。我在谷歌上搜索了解决方案并得到了很多答案,但由于我只是在学习过程中,所以它们对我来说很难理解。我在 Ubuntu 18.04 上使用 Python 3.6、Django 2.2.5、Postgresql 11。伙计们,你能看看我的代码并告诉我解决问题的最简单方法吗?提前致谢!
这是回溯
IntegrityError at /account/register/
duplicate key value violates unique constraint
"account_profile_mobile_number_key"
DETAIL: Key (mobile_number)=() already exists.
Request Method: POST
Request URL: http://127.0.0.1:8000/account/register/
Django Version: 2.2.5
Exception Type: IntegrityError
Exception Value:
duplicate key value violates unique constraint "account_profile_mobile_number_key"
DETAIL: Key (mobile_number)=() already exists.
Exception Location: /media/coduser/2NDTB/ProgramingPROJ/WebDevelopment/DjangoProject/MY-PROJECT/alternative/ex1/myvenv/lib/python3.6/site-packages/django/db/backends/utils.py in _execute, line 84
Python Executable: /media/coduser/2NDTB/ProgramingPROJ/WebDevelopment/DjangoProject/MY-PROJECT/alternative/ex1/myvenv/bin/python
Python Version: 3.6.8
Python Path:
['/media/coduser/2NDTB/ProgramingPROJ/WebDevelopment/DjangoProject/MY-PROJECT/alternative/ex1',
'/usr/lib/python36.zip',
'/usr/lib/python3.6',
'/usr/lib/python3.6/lib-dynload',
'/media/coduser/2NDTB/ProgramingPROJ/WebDevelopment/DjangoProject/MY-PROJECT/alternative/ex1/myvenv/lib/python3.6/site-packages']
Server time: Wed, 11 Sep 2019 01:11:15 +0000
这里是账户模型
from django.db import models
from django.conf import settings
from PIL import Image
class Profile(models.Model):
GENDER_CHOICES = (
('male', 'Male'),
('female', 'Female'),
('other', 'Other'),
('tell you later', 'Tell you later')
)
MARITAL_CHOICES = (
('married', 'Married'),
('unmarried', 'Unmarried'),
('single', 'Single'),
('divorced', 'Divorced'),
('tell you later', 'Tell you later')
)
user = models.OneToOneField(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
)
date_of_birth = models.DateField(blank=True, null=True)
gender = models.CharField(
max_length = 14,
choices = GENDER_CHOICES,
default = 'tell you later'
)
marital_status = models.CharField(
max_length = 14,
choices = MARITAL_CHOICES,
default = 'tell you later'
)
name_of_father = models.CharField(max_length = 30)
name_of_mother = models.CharField(max_length = 30)
present_address = models.CharField(max_length = 200)
permanent_address = models.CharField(max_length = 200)
mobile_number = models.CharField(max_length = 14, unique = True, db_index=True)
emergency_contact_number = models.CharField(max_length = 14)
smart_nid = models.CharField(max_length = 14, unique = True, db_index=True)
nationality = models.CharField(max_length = 20)
profile_picture = models.ImageField(default = 'default_profile.jpg', upload_to='users/%Y/%m/%d/')
def __str__(self):
return f'{self.user.username} Profile'
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
img = Image.open(self.profile_picture.path)
if img.height > 300 or img.width > 300:
output_size = (300, 300)
img.thumbnail(output_size)
img.save(self.profile_picture.path)
这是forms.py
from django import forms
from django.contrib.auth.models import User
from .models import Profile
class BaseForm(forms.Form):
def __init__(self, *args, **kwargs):
kwargs.setdefault('label_suffix', '')
super(BaseForm, self).__init__(*args, **kwargs)
class BaseModelForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
kwargs.setdefault('label_suffix', '')
super(BaseModelForm, self).__init__(*args, **kwargs)
class LoginForm(forms.Form):
username = forms.CharField(label_suffix='')
password = forms.CharField(widget=forms.PasswordInput, label_suffix='')
# BaseModelForm has been used instead of forms.ModelForm to remove the colon
class UserRegistrationForm(BaseModelForm):
password = forms.CharField(label='Password', widget=forms.PasswordInput)
password2 = forms.CharField(label='Repeat password', widget=forms.PasswordInput)
class Meta:
model = User
fields = ('username', 'first_name', 'last_name', 'email')
help_texts = {
'username': 'Letters, digits and @/./+/-/_ only',
}
def clean_email(self):
email = self.cleaned_data['email']
if User.objects.filter(email=email).exists():
raise forms.ValidationError(
'Please use another Email, that is already taken')
return email
def clean_password2(self):
cd = self.cleaned_data
if cd['password'] != cd['password2']:
raise forms.ValidationError('Passwords don\'t match.')
return cd['password2']
# This will let user to edit their profile
class UserEditForm(BaseModelForm):
class Meta:
model = User
fields = ('first_name', 'last_name', 'email')
# This will let user to edit their profile
class ProfileEditForm(BaseModelForm):
class Meta:
model = Profile
fields = ('date_of_birth', 'gender', 'marital_status', 'profile_picture',
'name_of_father', 'name_of_mother', 'present_address',
'permanent_address', 'mobile_number', 'emergency_contact_number',
'smart_nid', 'nationality')
这里是account app的views.py
from django.http import HttpResponse
from django.shortcuts import render , redirect
from django.contrib.auth import authenticate, login
from django.contrib.auth.decorators import login_required
from .forms import LoginForm, UserRegistrationForm, \
UserEditForm, ProfileEditForm
# For email verification
from django.contrib.sites.shortcuts import get_current_site
from django.utils.encoding import force_bytes, force_text
from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
from django.template.loader import render_to_string
from .token_generator import account_activation_token
from django.contrib.auth.models import User
from django.core.mail import EmailMessage
# end of email verification
# User Profile
from .models import Profile
# For flash message
from django.contrib import messages
def user_login(request):
if request.method == 'POST':
form = LoginForm(request.POST)
if form.is_valid():
cd = form.cleaned_data
user = authenticate(request,
username=cd['username'],
password=cd['password'])
if user is not None:
if user.is_active:
login(request, user)
return HttpResponse('Authenticated '\
'successfully')
else:
return HttpResponse('Disabled account')
else:
return HttpResponse('Invalid login')
else:
form = LoginForm()
return render(request, 'account/login.html', {'form': form})
def register(request):
if request.method == 'POST':
user_form = UserRegistrationForm(request.POST)
if user_form.is_valid():
# Create a new user object but avoid saving it yet
new_user = user_form.save(commit=False)
new_user.is_active = False # line for email verification
# Set the chosen password
new_user.set_password(
user_form.cleaned_data['password']
)
# Save the User object
new_user.save()
# Create the user profile
Profile.objects.create(user = new_user)
current_site = get_current_site(request)
email_subject = ' Activate Your Account'
message = render_to_string('account/activate_account.html', {
'user': new_user,
'domain': current_site.domain,
'uid': urlsafe_base64_encode(force_bytes(new_user.pk)),
'token': account_activation_token.make_token(new_user),
})
to_email = user_form.cleaned_data.get('email')
email = EmailMessage(email_subject, message, to=[to_email])
email.send()
return redirect('account_activation_sent')
else:
user_form = UserRegistrationForm()
return render(request,
'account/register.html',
{'user_form': user_form})
def account_activation_sent(request):
return render(request, 'account/account_activation_sent.html')
def account_activation_invalid(request):
return render(request, 'account/account_activation_invalid.html')
def activate_account(request, uidb64, token):
try:
uid = force_bytes(urlsafe_base64_decode(uidb64))
user = User.objects.get(pk=uid)
except(TypeError, ValueError, OverflowError, User.DoesNotExist):
user = None
if user is not None and account_activation_token.check_token(user, token):
user.is_active = True
user.save()
login(request, user)
return redirect('blog-home')
else:
return render(request, 'account_activation_invalid.html')
@login_required
def edit(request):
if request.method == 'POST':
user_form = UserEditForm(instance=request.user,
data=request.POST)
profile_form = ProfileEditForm(instance=request.user.profile,
data=request.POST,
files=request.FILES)
if user_form.is_valid() and profile_form.is_valid():
user_form.save()
profile_form.save()
messages.success(request, 'Profile updated successfully')
else:
messages.error(request, 'Error updating your profile')
else:
user_form = UserEditForm(instance=request.user)
profile_form = ProfileEditForm(instance=request.user.profile)
return render(request,
'account/profile.html',
{'user_form': user_form,
'profile_form': profile_form})
这是 token 生成器
from django.contrib.auth.tokens import PasswordResetTokenGenerator
from django.utils import six
class TokenGenerator(PasswordResetTokenGenerator):
def _make_hash_value(self, user, timestamp):
return (
six.text_type(user.pk) + six.text_type(timestamp) + six.text_type(user.is_active)
)
account_activation_token = TokenGenerator()
最佳答案
使用空字符串而不将它们转换为 null 是我的错误。其实我对Django不是很了解,但是我正在学习。根据 -mu is too short 在评论部分提供的解决方案,我已经能够解决问题。所以归功于 -mu 太短了
对于解决方案,我刚刚在 mobile_number 字段中添加了一个额外的参数 - null = True。就是这样。它解决了我的问题。
这是解决方案
mobile_number = models.CharField(max_length = 14, unique = True, db_index=True, null = True)
关于django - 这个问题 "duplicate key value violates unique constraint"困扰了我将近一个星期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57881034/
我想在 MySQL 中创建一个基本的 users 表。 我不希望数据库中出现重复的电子邮件或重复的用户名。 在创建表时防止这种情况的最佳方法是什么? 和以下有什么区别: 1. UNIQUE(用户名),
不可能将用户或请求识别为唯一,因为欺骗是微不足道的。 但是,有一些方法组合起来可以阻止作弊尝试并为用户提供准独特的地位。 我知道以下内容: IP 地址 - 将每个访问者的 IP 地址存储在某种数据库中
我有 2 个表: attCatAppSet, attCatAppSet_translation 在这两个表上,我对 2 列(不是主键)应用了唯一约束,因此列对值不能重复。 GO ALTER TABLE
我目前有这个: class Committee(models.Model): # ...some fields... committee_xml_id = models.Integer
这个问题在这里已经有了答案: 关闭10 年前。 Possible Duplicate: how to alter live mysql table to make a key non unique
unique() 算法可以在序列中原地移除重复的元素,这就要求被处理的序列必须是正向迭代器所指定的。在移除重复元素后,它会返回一个正向迭代器作为新序列的结束迭代器。可以提供一个函数对象作为可选的第三个
我的模型中有一个这样的字段 name = models.CharField(max_length=100, unique=True) 但现在该表/模型有很多数据,需要更改True 到 False 但无
在 Typeorm 中,您可以在列选项中设置唯一标志,或将列设置为实体的唯一。 你什么时候会使用什么,有什么区别?@Unique(["firstName"]) https://typeorm.io/#
我创建了一个名为 state 的数据集来自内置矩阵state.x77有两个连续变量(人口和收入)和两个因素变量(区域和面积)。 我使用 tapply() 计算了按地区划分的平均收入, by() , a
关于 SQLite 的问题。 在 CREATE TABLE SQL 中,我们可以通过任何一种方式添加 UNIQUE 约束:列约束或表约束。我的问题很简单。它们的工作方式不同吗? 我能找到的唯一区别是,
我在 Django 1.8 中构建模型,我正在使用抽象继承(我假设这是导致问题的原因)。我有抽象模型,然后我有基于这些抽象模型的模型。我在某些模型之间也有 ForeignKey 和 ManyToMan
我见过几个示例表,一个是 UNIQUE INDEX,另一个是 UNIQUE KEY。两者有什么区别??还是两者都一样? 最佳答案 CREATE TABLE KEY 通常是 INDEX 的同义词。 您可
我试着比较了两者,一个是pandas.unique(),另一个是numpy.unique(),我发现后者实际上超过了第一个。 我不确定卓越是否是线性的。 谁能告诉我为什么在代码实现方面存在这种差异?在
使用 PowerShell,我通过“import-csv”将文件中的 csv-data 导入对象 $csvList。这个 csv 数据有一个名为 Benutzer 的列。当做这样的事情时: $csvL
我有一个名为 GroupMembers 的表,它表示参与网站上某些社区的用户列表。 列看起来像这样: groupId | accountId | role 如您所见,里面有一个名为“role”的
我需要一个不会因 Android 设备而改变的 ID,它在任何时候都应该是唯一的,即使 WIFI、SIM 卡、蓝牙不存在,以及当用户重置他/她的手机或刷新新操作系统时也是如此。 我知道这些 Id。IM
假设我有“主题”表 CREATE TABLE subject (id int PRIMARY KEY, name VARCHAR(255) **UNIQUE**) 和相关的映射对象, @Entity
好的,让我解释一下场景。我有一个“订单”表,其中有一个自动增量键“orderno”。该表也有一个字段“orderdate”。我想要的是格式化的订单号。 (orderno_formatted) 采用以下
我有一个 boost::multi_index_container 其元素是这样的结构: struct Elem { A a; B b; C c; }; 主键(在数据库意义上)
当前列是 VARCHAR(255) NOT NULL,那么如何将其更改为 TEXT NOT NULL? 注意:要更改其属性类型的列是另一列的 UNIQUE KEY 组合。例如 唯一键(名称、描述) 列
我是一名优秀的程序员,十分优秀!