Django ManyToManyField的重复条目
我有一个表单来创建一个新用户 一旦用户被创建,它就会为其创建一个profile 在Profil的模型中,我有一个许多字段 到目前为止,一切正常 然后,我自动登录用户,并将其插入ManyToManyField 问题是在我的数据库中,我在许多领域没有注册条目。而且根本没有发生错误,所以很难知道问题出在哪里 这是我的模型:Django ManyToManyField的重复条目,django,Django,我有一个表单来创建一个新用户 一旦用户被创建,它就会为其创建一个profile 在Profil的模型中,我有一个许多字段 到目前为止,一切正常 然后,我自动登录用户,并将其插入ManyToManyField 问题是在我的数据库中,我在许多领域没有注册条目。而且根本没有发生错误,所以很难知道问题出在哪里 这是我的模型: class Profile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCAD
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
birthdate = models.DateField(null=True, blank=True)
avatar = models.FileField(upload_to=user_directory_path, validators=[validate_file_extension], blank=True, null=True)
sex = models.CharField(max_length=12, null=False)
favori = models.ManyToManyField(Games, verbose_name="Jeu")
我的整个观点是:
def view_register(request):
step = '1'
if step == '1':
minimum_form = MinimumRegisterForm()
if request.method == 'POST':
if '2' in request.POST:
step = '2'
minimum_form = MinimumRegisterForm(request.POST)
if minimum_form.is_valid():
identifiant = minimum_form.cleaned_data['identifiant']
email = minimum_form.cleaned_data['email']
password = minimum_form.cleaned_data['password']
confirm_password = minimum_form.cleaned_data['confirm_password']
sex = minimum_form.cleaned_data['sex']
#Verification
character_allowed = ['!', '_', '-', '$']
for letter in identifiant:
if not (letter.isalpha() or letter.isdigit() or letter in character_allowed):
step = '1'
messages.add_message(request, messages.INFO, 'Votre identifiant ne peut contenir que les charactères spcéciaux suivants : %s.' %(character_allowed))
if len(identifiant) > 15 :
step = '1'
messages.add_message(request, messages.INFO, 'Votre identifiant doit être inférieur à 16 charactères alphanumériques, actuellement il y en a %s.' %(len(identifiant)))
if User.objects.filter(email=email).exists():
step = '1'
messages.add_message(request, messages.INFO, 'Cette adresse e-mail est déjà utilisé.')
if User.objects.filter(username=identifiant).exists():
step = '1'
messages.add_message(request, messages.INFO, 'Cet identifiant n\'est pas disponible.')
if password == confirm_password:
strengh = password[0].isalpha()
if all(c.isalpha() == strengh for c in password):
step = '1'
messages.add_message(request, messages.INFO, 'Le mot de passe doit contenir au moins 8 charactères alphanumériques.')
else:
step = '1'
messages.add_message(request, messages.INFO, 'Confirmation du mot de passe invalide.')
#Fin de la vérification
favori_form = GamesRegisterForm()
if '3' in request.POST:
step = '3'
identifiant = request.POST['identifiant']
email = request.POST['email']
password = request.POST['password']
confirm_password = request.POST['confirm_password']
sex = request.POST['sex']
#Verification
character_allowed = ['!', '_', '-', '$']
for letter in identifiant:
if not (letter.isalpha() or letter.isdigit() or letter in character_allowed):
step = '1'
messages.add_message(request, messages.INFO, 'Votre identifiant ne peut contenir que les charactères spcéciaux suivants : %s.' %(character_allowed))
if len(identifiant) > 15 :
step = '1'
messages.add_message(request, messages.INFO, 'Votre identifiant doit être inférieur à 16 charactères alphanumériques, actuellement il y en a %s.' %(len(identifiant)))
if User.objects.filter(email=email).exists():
step = '1'
messages.add_message(request, messages.INFO, 'Cette adresse e-mail est déjà utilisé.')
if User.objects.filter(username=identifiant).exists():
step = '1'
messages.add_message(request, messages.INFO, 'Cet identifiant n\'est pas disponible.')
if password == confirm_password:
strengh = password[0].isalpha()
if all(c.isalpha() == strengh for c in password):
step = '1'
messages.add_message(request, messages.INFO, 'Le mot de passe doit contenir au moins 8 charactères alphanumériques.')
else:
step = '1'
messages.add_message(request, messages.INFO, 'Confirmation du mot de passe invalide.')
#Fin de la vérification
#Validation du Google Captcha
recaptcha_response = request.POST.get('g-recaptcha-response')
url = 'https://www.google.com/recaptcha/api/siteverify'
values = {
'secret': settings.GOOGLE_RECAPTCHA_SECRET_KEY,
'response': recaptcha_response
}
data = urllib.parse.urlencode(values).encode()
req = urllib.request.Request(url, data=data)
response = urllib.request.urlopen(req)
result = json.loads(response.read().decode())
if result['success']:
user = User.objects.create_user(identifiant, email, password)
user.save()
user_id = user.pk
Profile.objects.filter(user=user_id).update(sex=sex)
user = authenticate(username = identifiant, password = password)
login(request, user)
favori_form = GamesRegisterForm(request.POST, instance=request.user)
if favori_form.is_valid():
favori_form.save()
else :
step = '1'
messages.add_message(request, messages.INFO, 'Problème d\'instance. ')
else:
step = '1'
messages.add_message(request, messages.INFO, 'Un problème est survenu lors de la validation de Google Captcha.')
return render(request, 'register.html', locals())
forms.py:
class GamesChoiceField(ModelMultipleChoiceField):
def label_from_instance(self, obj):
media = settings.MEDIA
logo = '<img src="%s{url}"/>'.format(url=obj.logo) %(media)
return mark_safe("{logo} {title}".format(title=obj.title, logo=logo))
class GamesRegisterForm(forms.ModelForm):
game = Games.objects.all()
favori = GamesChoiceField(widget=forms.CheckboxSelectMultiple, required=True, queryset=game)
class Meta:
model = Profile
fields = ('favori', )
class GamesChoiceField(ModelMultipleChiiceField):
def标签来自_实例(self,obj):
媒体=设置。媒体
logo=''.format(url=obj.logo)%(媒体)
返回mark_safe(“{logo}{title}”。格式(title=obj.title,logo=logo))
类游戏注册表(forms.ModelForm):
game=Games.objects.all()
favori=GamesChoiceField(widget=forms.CheckboxSelectMultiple,required=True,queryset=game)
类元:
模型=外形
字段=('favori',)
要获得更好的答案,需要完整的查看代码,但要获得当前信息,您可以尝试:
instance, _ = Profile.objects.get_or_create(user=user)
favori_form = GamesRegisterForm(request.POST, instance=instance)
if favori_form.is_valid():
favoris = favori_form.save()
为了获得更好的答案,您需要完整的视图代码,但对于当前信息,您可以尝试:
instance, _ = Profile.objects.get_or_create(user=user)
favori_form = GamesRegisterForm(request.POST, instance=instance)
if favori_form.is_valid():
favoris = favori_form.save()
如果我遵循您的观点,我认为
.create\u user(..)
应该放在If-favori\u表单之前。是否有效():
为什么?
因为您需要在保存favori
之前创建用户,其中favori
在Profile
模型中可用
基本上,流程应为:
- 创建新用户
- 使用当前用户创建配置文件
- 将
分配给当前配置文件favori
对于recaptcha,我建议您使用此插件以简化操作
如果我遵循您的观点,我认为
.create\u user(..)
应该放在If-favori\u表单之前。是否有效():
为什么?
因为您需要在保存favori
之前创建用户,其中favori
在Profile
模型中可用
基本上,流程应为:
- 创建新用户
- 使用当前用户创建配置文件
- 将
分配给当前配置文件favori
对于recaptcha,我建议您使用此插件以简化操作
请把你喜欢的表格包括在课堂上..完成了。谢谢。您的
视图.py中的收藏夹表单是否已安装?请同时包含视图..我更新了代码。是的,我的表格已经准备好了。请把你喜欢的表格包括在课堂上。已经完成了。谢谢。您的视图.py中的收藏夹表单是否已安装?请同时包含视图..我更新了代码。是的,我的表单已安装。get\u或\u create
return tuple instance plus boolean是否已创建,因此根据当前逻辑,我们不需要布尔值,只需添加
即可将未使用的数据保存在此变量中,并具有干净的代码。get\u或\u create
return tuple instance plus boolean是否已创建,因此,根据当前逻辑,我们不需要布尔值,只需简单地添加\uu
即可将未使用的数据保存在此变量中,并获得干净的代码。