Внешний ключ не назначен модели в базе данных

Я недавно начал изучать django и делал CRM.

models.py: class Complaint(models.Model):

SOURCE_CHOICES=(
    ('email','E-mail'),
    ('call','Call'),
    ('ticket','Ticket')
)

store_name=models.CharField(max_length=20)
store_contact_no=models.IntegerField(max_length=10)
store_id=models.CharField(max_length=7)
source=models.CharField(choices=SOURCE_CHOICES, max_length=10)
agent=models.ForeignKey("Agent", null = True, blank = True, on_delete=models.SET_NULL)
category=models.ForeignKey("Category", related_name="complaints", null = True, blank = True, on_delete=models.SET_NULL)
description = models.TextField()
customer = models.ForeignKey("Customer", null = True, blank = True, on_delete=models.SET_NULL)

def __str__(self):
    return f"{self.store_name} {self.store_id}"

class Customer(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE)

def __str__(self):
    return self.user.username

forms.py

class CustomerComplaintForm(forms.ModelForm):
    class Meta:
        model = Complaint
        fields = (
            'store_name',
            'store_id',
            'store_contact_no',
            'description',  
        )

views.py

class 
CustomerComplaintCreateView(OwnerCustomerAndLoginRequiredMixin, 
generic.CreateView):
    template_name = "customercomplaint_create.html"
    form_class = CustomerComplaintForm

    def get_success_url(self):
        return "/complaints"

    def form_valid(self, form):
        complaint = form.save(commit=False)
        complaint.Customer = self.request.user.username
        complaint.source = 'ticket'
        complaint.save()
        return super(CustomerComplaintCreateView, 
    self).form_valid(form)

html template:

{% extends "base.html" %}    
{% load tailwind_filters %}

{% block content %}

<div class="max-w-lg mx-auto">
    <a class="hover:text-blue-500" href="/complaints">Go back to complaints </a>  
    <div class="py-5 border-t border-gray-200">       
    <h1 class="text-4xl text-gray-800"> Create a new complaint  </h1>  
    </div>
    <form method='post' class="mt-5">  
        {% csrf_token %}
        {{ form|crispy }} 
        <button type="submit" class="w-full bg-blue-500 text-white hover:bg-blue-600 px- 
        3 py-2 rounded-md">Create</button>
    </form>
</div>                

{% endblock content %}

Проблема заключается в том, что поле источника заполняется в базе данных именем Ticket, как и предполагалось. Но поле 'Customer' не заполняется именем пользователя. 'Self.request.user.username' здесь не является проблемой, так как имя пользователя правильно выводится в консоль.

это должен быть пользователь, а не имя пользователя Потому что Cutomer является объектом User, а не только Uesrname

def form_valid(self, form):
        complaint = form.save(commit=False)
        complaint.Customer = self.request.user
        complaint.source = 'ticket'
        complaint.save()

Проблема в том, что complaint.Customer = self.request.user.username вы пытаетесь присвоить имя пользователя предполагаемому объекту Customer. Вот подход, который можно использовать для решения проблемы.

Внутри файла views.py находится класс представления.

Вы можете получить объект customer, а затем присвоить его полю customer на объекте complaint.

from django.shortcuts import get_object_or_404

def form_valid(self, form):
    complaint = form.save(commit=False)
    customer = get_object_or_404(Customer, user=self.request.user)  # recommended

    # or 
    # customer = get_object_or_404(Customer, user__username__iexact=self.request.user.username)

    if customer:
         # Here on your model you have a lowercase `c` for the customer field, not 'C`
         complaint.customer = customer  # -> This will assign the customer object, "FK".

    complaint.source = 'ticket'
    complaint.save()
    return super(CustomerComplaintCreateView, self).form_valid(form)

Это должно сработать.

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