python - Django कई करने वाली कई रिश्ते(श्रेणी)




django-models django-forms (2)

मेरा लक्ष्य मेरे पोस्ट मॉडल में श्रेणियां जोड़ना है मैं बाद में अलग-अलग और कभी-कभी कई श्रेणियों द्वारा सभी पोस्ट की क्वेरी करने में सक्षम होना चाहता हूं।

models.py

class Category(models.Model):
    categories = (
        ('1', 'red'),
        ('2', 'blue'),
        ('3', 'black')
    )
    title = models.CharField(max_length=50, blank=True, choices=categories)

class Post(models.Model):
    text = models.CharField(max_length=500)
    category = models.ManyToManyField(Category)

forms.py

class Post_form(forms.ModelForm):

    categories = (
        ('1', 'red'),
        ('2', 'blue'),
        ('3', 'black')
    )
    category = forms.MultipleChoiceField(required=False, widget=forms.CheckboxSelectMultiple,
    choices=categories)

    class Meta:
        model = Post
        fields = (
            'text',
            'category'
        )

इससे पहले कि आप किसी अन्य को बचा सकें, मैं एक obj बचाने के तर्क पर उलझन में हूँ

views.py

def post(request):
    if request.method == 'POST':
        form = Post_form(request.POST, request.FILES)
        if form.is_valid():
            post = form.save(commit=False)
            post.user = request.user

            p1 = Category(form.cleaned_data['category'])
            post.category.add(p1)

        return redirect('home:home')

    else:
        form = Post_form()
        args = {'form': form }
        return render(request, 'home/new_post.html', args)

त्रुटि:

"<Post: Post object>" needs to have a value for field "id" before this many-to-many relationship can be used.

संपादित करें:

form.cleaned_data ['श्रेणी'] मुख्य मुद्दा पैदा करने वाली एक सूची वापस कर रहा है अब मेरी समस्या यह है कि मेरी पसंद श्रेणी वर्ग के शीर्षक में सहेजा नहीं जा रहा है, इसके बजाय चयन संख्या को सहेजा जा रहा है। यहाँ मैं क्या मिला

def post(request):
    if request.method == 'POST':
        form = Post_form(request.POST, request.FILES)
        if form.is_valid():
            post = form.save(commit=False)
            post.user = request.user
            post.save()
            for k in form.cleaned_data['category']:
                p1 = Category(title=k)
                p1.save()
                post.category.add(p1)

हल किया

views.py

def post(request):
    if request.method == 'POST':
        form = Post_form(request.POST, request.FILES)
        if form.is_valid():
            post = form.save(commit=False)
            post.user = request.user
            post.save()

            for k in form.cleaned_data['category']:
                selection = Category.objects.get(pk=k)
                post.category.add(selection)

            return redirect('home:home')

इस तरह से अपना दृश्य संपादित करें,

if form.is_valid():
    title = form.cleaned_data['category']
    post = form.save(commit=False)
    post.user = request.user
    post.save()
    category = Category.objects.create(title=title)
    post.category.add(category)
    post.save_m2m()
    return redirect('home:home')

मुख्य समस्या यह है कि आप श्रेणी को निर्दिष्ट करने से पहले पोस्ट ऑब्जेक्ट को डेटाबेस में सहेजा गया है। इसलिए इस दृश्य को थोड़ा बदलें

def post(request):
if request.method == 'POST':
    form = Post_form(request.POST, request.FILES)
    if form.is_valid():
        post = form.save(commit=False)
        post.user = request.user
        post.save()
        for k in form.cleaned_data['category']:
            p1 = Category.objects.create(title=k)
            p1.save()
            post.category.add(p1)




django-views