django-post_save-订单匹配查询不存在错误

问题描述 投票:0回答:1

[在创建WishList模型时创建Order模型的实例和Profile模型的实例,并在注册Profile的情况下创建User模型的实例,所以就像这个:

用户寄存器—>User—>Profile—> WishListOrder

该系列创作,我认为“ post_save”信号将是最好的,代码如下:

# to create a profile whenever a user is created
@receiver(post_save, sender=User, dispatch_uid="create_user_profile")
def create_profile(sender, instance, created, **kwargs):
    user_profile, created = Profile.objects.get_or_create(user=instance)
    if created:
        user_profile.save()

@receiver(post_save, sender=Profile, dispatch_uid="create_user_wish_list")
def create_wish_list(sender, instance, created, **kwargs):
    user_wish_list, created = WishList.objects.get_or_create(profile=instance)
    user_wish_list.save()

# to create a shopping_bag/order whenever a profile is created
@receiver(post_save, sender=Profile, dispatch_uid="create_profile_order")
def create_profile_order(sender, instance, created, **kwargs):
    if not Order.objects.get(profile=instance, is_ordered=False):
        profile_order, created = Order.objects.get_or_create(
            profile=instance, 
            ref_number="{}'s shopping bag".format(instance.user.username),
            )
        profile_order.save()

[根据它们自己的应用程序,它们最初位于三个不同的目录中(users应用程序:Profile模型; wishlist应用程序:WishList模型; shopping应用程序:Order模型),并且运行良好当注册用户登录时,例如我在整个配置文件开头创建的超级用户。但是,当注册新用户时,提交RegistrationForm后,会发生此错误:

不存在订单匹配查询。

view.py

def register_view(request):
    next = request.GET.get('next')
    form = UserRegisterForm(request.POST or None)

    if form.is_valid():
        new_user = form.save(commit=False)
        password = form.cleaned_data.get('password2')
        new_user.set_password(password)
        new_user.save()
        user = authenticate(username=new_user.username, password=password)
        login(request, user)
        if next:
            return redirect(next)
        return redirect('/')

    return render(request, 'registration/register.html', {'form': form})

form.py:


class UserRegisterForm(forms.ModelForm):
    password1 = forms.CharField(
        label=_("Пароль"),
        strip=False,
        widget=forms.PasswordInput
        )
    password2 = forms.CharField(
        label=_("Подтверждение пароля"),
        strip=False,
        widget=forms.PasswordInput,
        help_text=_("Введите пароль ещё раз")
        )

    class Meta:
        model = User
        fields = ['username', 'password1', 'password2', ]

    def clean(self, *args, **kwargs):
        password1 = self.cleaned_data.get('password1')
        password2 = self.cleaned_data.get('password2')
        if password1 and password2 and password1 != password2:
            raise forms.ValidationError('Пароли не совпадают')
        return super().clean(*args, **kwargs)
django forms view
1个回答
0
投票
if not Order.objects.get(profile=instance, is_ordered=False)语句是错误的。因为如果对象不存在,因为get()方法引发了模型DidNotExist异常,所以您可以使用if not Order.objects.filter(profile=instance, is_ordered=False).exists()代替get()查询。
© www.soinside.com 2019 - 2024. All rights reserved.