Django多对多关系(类别) [英] Django Many-To-Many Relationship (category)

查看:161
本文介绍了Django多对多关系(类别)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的目标是向帖子模型添加类别。我希望以后可以按不同类别(有时甚至是多个类别)查询所有帖子。



models.py

  class Category(models.Model): 
类别=(
('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 = form.MultipleChoiceField(required = False,widget = forms.CheckboxSelectMultiple,
选择=类别)

类元:
模型=发布
字段=(
'text',
'类别'

我对保存一个的逻辑感到困惑

views.py

  def post(request):
如果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')

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

错误:

 < Post:Post object>必须先使用字段 id的值,然后才能使用这种多对多关系。 

编辑:



form.cleaned_data [ 'category']正在返回导致主要问题的列表。现在我的问题是我的选择没有保存到Category类的标题中,而是保存了选择号。这就是我得到的。

  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 =请求用户
post.save()
for k in form.cleaned_data ['category']:
p1 = Category(title = k)
p1.save()
post.category.add(p1)

已解决



views.py

  def post(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')


解决方案

主要问题是您在分配类别之前尚未将发布对象保存到数据库中。因此,将视图更改为以下内容

  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)


My goal is to add categories to my Post model. I would like to be able to later query all post by different and sometimes multiple categories.

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'
        )

I'm confused on the logic of saving one obj before you can save another.

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)

error:

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

EDIT:

form.cleaned_data['category'] is returning a list causing the main issue. Now my problem is my choice isn't being saved into the title of the Category class, the selection number is being saved instead. Here's what i got.

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)

SOLVED

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')

解决方案

the main problem is that you havent saved the post object to the database before assigning the Category. so change the view a bit to this

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多对多关系(类别)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆