Как добавить несколько форм в представление Django, если одна из них является вводом ChatGPT?

Я хочу добавить две отдельные формы в один вид, что не является большой проблемой, но я не могу найти, где находится материал, который делает ошибку и обе формы не работают. Это первый раз, когда я интегрирую ChatGPT, и я не так хорошо знаком с fetch api. После отправки сообщения я не получаю никаких сообщений об ошибке от формы http-запроса, просто не сохраняю данные. Форма ChatGPT говорит: Произошла ошибка. Пожалуйста, попробуйте еще раз. (я изменил имена и идентификаторы, так что если здесь они совпадают, то на моем сервере это не вызовет проблем)

views.py

def add_new_stuff(request, company_uuid, position_id):

    form = AddStuffFrom(request.POST)

    if request.method == "POST" :
        if 'chatGptSubmitBtn' in request.POST:
            try:
                data = json.loads(request.body)
                user_input = data.get('user_input', '')
                if user_input:
                    chatgpt_response = get_chatgpt_response(user_input)
                    return JsonResponse({'response': chatgpt_response})
                return JsonResponse({'error': 'No user input provided'}, status=400)
            except json.JSONDecodeError:
                return JsonResponse({'error': 'Invalid JSON'}, status=400)
 
        if 'stuffSubmitBtn' in request.POST:
            if form.is_valid():
                form.save()

    context = {
        'form': form,
        'company_uuid': company_uuid,
        'uuid': company_uuid,
        'position_id': position_id,
    }

    return render(request, 'stuff/add_new_stuff.html', context)

html

<form id="openai_form" method="post">
    {% csrf_token %}
        <label for="user_input" class="h5 text-primary"><i class="bi bi-robot"></i> AI</label>
        <input type="text" class="form-control" id="user_input" name="user_input" required>
        <button type="submit" id="chatGptSubmitBtn" class="btn btn-primary btn-sm my-3" id="aidaSubmitBtn"><i class="bi bi-play-circle-fill"></i> Mehet</button>
    <div class="my-3 px-2" id="response"></div>
    </form>

    <form id="independent_form" method="post">
        {% csrf_token %}
            {{ form.as_p }}
            <button type="submit" id="stuffSubmitBtn">Submit stuff</button>
    </form>


<script>
    document.getElementById('openai_form').onsubmit = async function(event) {
    event.preventDefault();
        const user_input = document.getElementById('user_input').value;
        const responseDiv = document.getElementById('response');

        try {
            const response = await fetch("{% url 'stuff:add_new_stuff' company_uuid=company_uuid position_id=position_id %}", {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json',
                    'X-CSRFToken': '{{ csrf_token }}'
                },
                body: JSON.stringify({ user_input: user_input })
            });

            const data = await response.json();
            if (response.ok) {
            responseDiv.innerText = data.response;
            } else {
            responseDiv.innerText = 'Error: ' + data.error;
            }
        } catch (error) {
        responseDiv.innerText = 'An error occurred. Please try again.';
        } finally {
        spinner.style.display = 'none';
        }
    };

</script>

forms.py

class AddStuffFrom(forms.ModelForm):

    class Meta:
        model = Stuff
        fields = '__all__'
    
        widgets = {
            'stuff': forms.TextInput(attrs={'class': 'form-control'}),
            'grade_01': forms.TextInput(attrs={'class': 'form-control'}),
            'grade_02': forms.TextInput(attrs={'class': 'form-control'}),
            'grade_03': forms.TextInput(attrs={'class': 'form-control'}),
            'grade_04': forms.TextInput(attrs={'class': 'form-control'}),
        }

models.py

class Stuff(models.Model):
    
    def __str__(self):
        return str(self.position)

    position = models.ForeignKey(Company_positions, null=True, blank=True, on_delete=models.CASCADE)
    company = models.ForeignKey(Company, null=True, blank=True, on_delete=models.CASCADE)
    stuff = models.CharField(max_length=300, blank=True, null=True)
    grade_01 = models.CharField(max_length=500, blank=True, null=True)
    grade_02 = models.CharField(max_length=500, blank=True, null=True)
    grade_03 = models.CharField(max_length=500, blank=True, null=True)
    grade_04 = models.CharField(max_length=500, blank=True, null=True)
    datetime = models.DateTimeField(auto_now_add=True)
Вернуться на верх