Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django ManyToManyField的重复条目_Django - Fatal编程技术网

Django ManyToManyField的重复条目

Django ManyToManyField的重复条目,django,Django,我有一个表单来创建一个新用户 一旦用户被创建,它就会为其创建一个profile 在Profil的模型中,我有一个许多字段 到目前为止,一切正常 然后,我自动登录用户,并将其插入ManyToManyField 问题是在我的数据库中,我在许多领域没有注册条目。而且根本没有发生错误,所以很难知道问题出在哪里 这是我的模型: class Profile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCAD

我有一个表单来创建一个新用户

一旦用户被创建,它就会为其创建一个profile

在Profil的模型中,我有一个许多字段

到目前为止,一切正常

然后,我自动登录用户,并将其插入ManyToManyField

问题是在我的数据库中,我在许多领域没有注册条目。而且根本没有发生错误,所以很难知道问题出在哪里

这是我的模型:

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
即可将未使用的数据保存在此变量中,并获得干净的代码。