Теги не будут храниться в базе данных в django

Теги не будут храниться в базе данных в Django

def addque(request):
    if request.method == "POST":
        user = request.user
        if user.is_anonymous:
            return redirect('addquery')

        if user.is_active:
            question = request.POST['question']
            body = request.POST['body']
            tags = request.POST['tags']
            aquuid = request.user.aquuid
            addquery = Question(question=question, user_id=aquuid, que_body=body, tags=tags)
            addquery.save()

            return redirect('addquery')
    else:
        return render(request, 'question/ask.html')

После ввода данные сохраняются в поле тегов, но не сохраняются в базе данных. Я могу успешно вставлять данные вручную через панель администратора, но не как нештатный пользователь. Я установил taggit и поместил его в installed_apps в settings.py. В чем проблема с кодом?

Теги - это объекты типа "многие ко многим", и вы не можете добавить их к объекту, пока объект не будет сохранен. В документации показано, что для добавления тегов к экземпляру модели нужно использовать .add(). Ваш код должен выглядеть так:

    addquery = Question(question=question, user_id=aquuid, que_body=body)
    addquery.save()
    addquery.tags.add(tags)

Кроме того, вам может быть лучше использовать ModelForm, которая может обрабатывать теги и все эти вещи, которые вы делаете:

    question = request.POST['question']
    body = request.POST['body']
    tags = request.POST['tags']

https://django-taggit.readthedocs.io/en/latest/forms.html

Использовать модельную форму

В html используйте id формы следующим образом

HTML

<form action="{% url 'addquery' %}" method="post">
{% csrf_token %}
<div class="psrelative">
<input id="id_question" name="question" type="text" maxlength="300" tabindex="100" placeholder="e.g. Is there an R function for finding the index of an element in a vector?" class="s-input js-post-title-field" value="" data-min-length="15" data-max-length="150" autocomplete="off" required>
</div>
<textarea name="que_body" id="id_que_body" class="textarea-body"></textarea required>
<div class="psrelative">
<input id="id_tags" name="tags" type="text" maxlength="300" tabindex="100"
placeholder="e.g. (ruby-on-rails vba spring)" class="s-input js-post-title-field" value="" data-min-length="15" data-max-length="150" autocomplete="off" required>
</div>
<button class="review-question-btn" type="submit" tabindex="120"> Submit your question
</button>
</form>

Forms.py

from django import forms
from .models import Question

class Addqueform(forms.ModelForm):
    class Meta:
        model = Question
        fields = ['question','que_body','tags']

Views.py

from .forms import Addqueform

def addque(request):
    queform = Addqueform(request.POST)
    if request.method == "POST":
        user = request.user
        if user.is_anonymous:
            return redirect('addquery')

        if user.is_active:
            if queform.is_valid():
                aquuid = request.user.aquuid
                question = queform.cleaned_data['question']
                body = queform.cleaned_data['que_body']
                tags = queform.cleaned_data['tags']
                addquery = Question(question=question, user_id=aquuid, que_body=body)
                for tag in tags:
                    addquery.tags.add(tag)
                addquery.save()
                return redirect('addquery')
            else:
                queform = Addqueform()
                return render(request, 'question/ask.html', {'form': queform})
    else:
        return render(request, 'question/ask.html', {'form': queform})

Я думаю, что это сработает

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