Django не может сохранить форму в определенной Модели

После того, как я возился с кодом в течение часа, я должен спросить вас.

У меня есть модель Ticket, где кто-то может открыть тикет и он будет отправлен администратору. Теперь я попытался добавить функцию, чтобы пользователь и администратор могли писать сообщения в этом тикете.

Моя попытка:

\\\views.py

def ticket_system_view(request, id):
    obj = Ticket.objects.get(id=id)

    waiting_message = "Mark as 'Waiting'"
    solved_message = "Mark as 'Solved'"

    if obj.reopened_counter > 5:
        solved_message = 'Ticked solved forever'
        waiting_message = 'Ticked solved forever'

    button_form = TicketSolved(request.POST)
    time.sleep(2)

    if button_form.is_valid:
        obj.reopened_counter += 1
        if obj.reopened_counter > 5:
            obj.ticket_waiting = True
            obj.ticket_solved = False

        if obj.ticket_waiting == False and obj.ticket_solved == True:
            obj.ticket_waiting = True
            obj.ticket_solved = False
        else:
            obj.ticket_waiting = False
            obj.ticket_solved = True
        obj.save()

    user_form = TicketMessagesForm(
        request.POST, instance=TicketMessages(#no idea what to do hea# maybe id=id?#))
    if user_form.is_valid():
        instance = user_form.save(commit=False)

        # something to save the user message

        instance.save()

    return render(request, 'ticket-system.html', {'obj': obj, 'waiting_message': waiting_message, 'solved_message': solved_message, 'button_form': button_form, 'user_form': user_form})

Бесполезная button_form просто потому, что я не знал, как обрабатывать формы, два Post запроса. Вы можете игнорировать эту вещь ticket_waiting/ticket_solved. Важной является форма TicketMessageForm. Эта форма только для пользователя, я добавлю форму для администратора позже. Она должна работать так, чтобы отправленное сообщение присваивалось тикету. Когда билет открывается, сообщения должны быть помещены туда. У меня есть две модели для этого. Один раз сам тикет со всей информацией и один раз модель для сообщений, которая связана с тикетом. Возможно, было ошибкой иметь две модели.

Две модели выглядят следующим образом

\\\models.py

class Ticket(models.Model):
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        default=None,
        null=True,
        on_delete=models.CASCADE,
    )
    title = models.CharField(max_length=200)
    description = models.TextField()
    creator_adress = models.GenericIPAddressField(null=True)
    start_date = models.DateTimeField(default=timezone.now)
    ticket_waiting = models.BooleanField(default=True)
    ticket_solved = models.BooleanField(default=False)
    reopened_counter = models.IntegerField(default=0)

    def __str__(self):
        return str(self.title)


class TicketMessages(models.Model):
    ticket = models.ForeignKey(Ticket, on_delete=models.CASCADE)
    admin_message = models.TextField()
    user_message = models.TextField()

А еще более беспорядочный, но импортный HTML находится здесь \.html

{% if obj.user != request.user %}
<p>Page Not Found</p>

{% else %}
<p>Ticket ID {{obj.id}}</p>

{{ obj.title }} {{ obj.description }} {% endif %}
<br></br>

<form method="POST">
  {% csrf_token %}
  {{ button_form }}
  <button {% if obj.reopened_counter > 5 %} disabled="" {% endif %} type="submit">
  {% if obj.ticket_waiting == True %}
   {{ solved_message }}
  {% else %}
  {{ waiting_message }}
  {% endif %}
</button>
</form>

<p> Changes: {{ obj.reopened_counter }} </p>

<br>
<h2>New Message</h2>
<form method="POST">
  {% csrf_token %}
  {{ user_form }}
  <button type="submit">New Message</button>
</form>

\forms.py

class TicketSolved(forms.Form):
    delete = forms.CharField(
        label='', max_length=0).widget = forms.HiddenInput()


class TicketMessagesForm(forms.ModelForm):
    class Meta:
        model = TicketMessages

        fields = (
            'user_message',
        )

Текущее состояние с этим кодом: NOT NULL constraint failed: dashboard_ticketmessages.ticket_id после отправки сообщения пользовательского тикета

Что необходимо: Сохранение сообщений пользователя в тикет. (рабочая форма_пользователя = TicketMessagesForm.)

Как модель TicketMessages выглядит в панели администратора: model

Похоже, что все поля в вашей модели TicketMessages являются обязательными, но в форме у вас только user_message. Таким образом, чтобы форма была валидной, она должна иметь не нулевые значения для каждого поля. Похоже, что лучшим решением будет обновить вашу модель, чтобы определить поля с нулевыми значениями:

class TicketMessages(models.Model):
    ticket = models.ForeignKey(Ticket, on_delete=models.CASCADE)
    admin_message = models.TextField(null=True)
    user_message = models.TextField(null=True)
Вернуться на верх