Django m2m关系问题

时间:2016-04-15 18:41:06

标签: python django many-to-many

我不是django的专家,很抱歉,这个问题似乎很愚蠢。 我正在尝试在django中创建一个简单的注册页面,并且我遇到了多对多关系的一些问题。

我的models.py

class Dog(models.Model):
    name = models.CharField(max_length=100)
    reg_num = models.CharField(max_length=100)
    owner = models.ManyToManyField('Owner', db_column='owner')

    class Meta:
        managed = False
        db_table = 'dog'

    def __str__(self):
        return self.name


class Owner(models.Model):
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name

我正在使用django的基于类的视图:

class DogForm(ModelForm):
    class Meta:
        model = Controle
        fields = ['name', 'reg_num','owner']

class DogMixin(object):
    model = Dog
    form_class = DogForm
    template_name = 'generic_form.html'
    success_url = reverse_lazy('dog_list')


    def form_valid(self, form):
        obj = form.save(commit=False)
        obj.user = self.request.user
        obj.save()        
        return HttpResponseRedirect(self.success_url)


class DogCreate(DogMixin, CreateView):
    pass

class DogUpdate(DogMixin, UpdateView):
    pass

class DogDelete(DogMixin, DeleteView):
    template_name = 'generic_delete.html'

最后是html文件:

            <tbody>
            {% for dog in object_list%}
            <tr>
                <td> {{dog.name}}</td>
                <td> {{dog.reg_num}}</td>
                <td> {{dog.owner}}
            </tr>
            {% endfor %}
    </tbody>

当我创建狗实例时,我在框中选择所有者。 该表没问题,除了“dog.owner”它显示为None。 我错过了什么?

1 个答案:

答案 0 :(得分:1)

您在视图中指定了dog.user,但该字段名为owner

但是,我不认为你想要一个多对多字段。这意味着狗拥有许多所有者,并且还意味着您需要在模板中迭代dog.owner.all。我想你想要一个简单的ForeignKey,在这种情况下你可以做dog.owner = self.request.user然后输出它就像你已经做的那样。

修改如果您确定,则需要当前用户添加到所有者的列表dog.owner.add(self.request.user) 。而且,正如我所说,在您的显示模板中,您不能只显示“所有者”,因为有很多:您需要迭代而不是dog.owner.all并显示每个的名称。