Skip to main content
 首页 » 编程设计

python之Django 多对多关系(类别)

2024年10月01日36del

我的目标是将类别添加到我的 Post 模型中。我希望以后能够按不同类别(有时是多个类别)查询所有帖子。

模型.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) 

表单.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' 
        ) 

我对保存一个对象之前保存另一个对象的逻辑感到困惑。

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

已解决

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

请您参考如下方法:

主要问题是您在分配类别之前没有将帖子对象保存到数据库中。所以稍微改变一下 View

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)