Django - Ошибка при отправке формы анонимным пользователем

В одном из моих представлений у меня есть форма, где когда пользователь входит в систему и отправляет форму, она работает нормально.

Однако, когда анонимный пользователь отправляет форму, я получаю следующую ошибку:

Cannot assign "<SimpleLazyObject: <django.contrib.auth.models.AnonymousUser object at 0x1052fd3a0>>": "User_Inquiries.user" must be a "CustomUser" instance.

Эта форма должна быть отправлена независимо от того, является ли пользователь анонимным или вошел в систему. Что мне нужно сделать, чтобы решить эту проблему?

Код ниже.

Любая помощь будет с радостью принята. Спасибо!

views.py

def account_view_contact(request):
    form = ContactUsForm(request.POST or None, request.FILES or None,)
    user_profile = User_Inquiries.objects.all()
    user_profile = User_Info.objects.all()
    user = request.user
    if request.method == "POST":  # checking if request is POST or Not
        # if its a post request, then its checking if the form is valid or not
        if form.is_valid():
            contact_instance = form.save(commit=False)  # "this will return the 'Listing' instance"
            contact_instance.user = user # assign 'user' instance
            contact_instance.save() # calling 'save()' method of model
            return redirect("home")         
    
    context = {
         'form': form, 'user_profile': user_profile
    }

    return render(request, 'contact.html', context)

models.py

class User_Inquiries(models.Model):
    email = models.EmailField(max_length=100, null=True)
    name = models.CharField(max_length=100, null=True)
    subject = models.CharField(max_length=100, null=True)
    message = models.CharField(max_length=100, null=True)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, null=False, on_delete=models.CASCADE)
    date_submitted = models.DateTimeField(auto_now_add=True, null=True)
    
    class Meta:
        verbose_name_plural = "User Inquiries"
        
    @property
    def user_message(self):
        return truncatechars(self.message, 30)

Что вы можете сделать:

Сначала добавьте поле пользователя с помощью null=True

class User_Inquiries(models.Model):
    # ....
    user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, on_delete=models.CASCADE)
    # ...

Во-вторых, на ваш взгляд, нужно предоставлять поле user только в том случае, если пользователь аутентифицирован. Потому что AnonymousUser может быть сохранено в базе данных.

def account_view_contact(request):
    user_profile = User_Info.objects.all()
    
    # If it's a post request
    if request.method == "POST":
        form = ContactUsForm(request.POST, request.FILES or None,)
        if form.is_valid():
            if request.user is authenticated:
                # Only authenticated user can be assigned
                contact_instance = form.save(commit=False)
                contact_instance.user = request.user
                contact_instance.save()
                return redirect("home")
            else:
                # Save the form without user because no user is logged in
                form.save()
    
    # Handle no POST request
    else:
        form = ContactUsForm()
        context = {
            'form': form, 'user_profile': user_profile
        }
        
        return render(request, 'contact.html', context)
            
        
    
    

в модели User_Inquiries пользователь должен быть blank = True и null = True. В представлении проверьте, вошел ли пользователь в систему, прежде чем установить contact_instance.user в user.

models.py

class User_Inquiries(models.Model):

    user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, on_delete=models.CASCADE)

views.py

def account_view_contact(request):
    form = ContactUsForm(request.POST or None, request.FILES or None,)
    user_profile = User_Inquiries.objects.all()
    user_profile = User_Info.objects.all()
    # check if the user is authenticated
    if request.user.is_authenticated:
        user = request.user

    if request.method == "POST":  # checking if request is POST or Not
        # if its a post request, then its checking if the form is valid or not
       if form.is_valid():
            contact_instance = form.save(commit=False)  # "this will return the 'Listing' instance"
            contact_instance.user = user # assign 'user' instance
            contact_instance.save() # calling 'save()' method of model
            return redirect("home")         

    context = {
         'form': form, 'user_profile': user_profile
    }

    return render(request, 'contact.html', context)

проверьте, аутентифицирован ли пользователь в django

set null and blank = True

Я попробовал вышеуказанные решения, и они сработали. Я также использовал CreateView, чтобы разобраться с этим, и он работал безупречно. Код ниже:

class account_view_contact(CreateView):
    model = User_Inquiries
    form_class = ContactUsForm
    template_name = "contact.html"
    success_url = reverse_lazy("home")

    def form_valid(self, form):
        if self.request.user.is_authenticated:
            self.object = form.save(commit=False)
            self.object.created_by = self.request.user
            self.object.save()
        else:     
            self.object = form.save(commit=False)
            self.object.save()
        return super().form_valid(form)

Спасибо всем!

Вернуться на верх