【问题标题】:Django m2m relationship problemsDjango m2m 关系问题
【发布时间】:2016-04-15 18:41:05
【问题描述】:

我不是 django 专家,如果这个问题看起来很愚蠢,很抱歉。 我正在尝试在 django 中创建一个简单的注册页面,但在多对多关系方面遇到了一些问题。

我的模型.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”它显示为无。 我错过了什么?

【问题讨论】:

    标签: python django many-to-many


    【解决方案1】:

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

    但是,我认为您不希望在这里使用多对多字段。这意味着狗有很多主人,也意味着您需要在模板中迭代dog.owner.all。我认为您需要一个简单的 ForeignKey,在这种情况下您可以执行dog.owner = self.request.user,然后按照您已经在执行的方式输出它。

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

    【讨论】:

    • 我使用了多对多,因为我在一个主人可以是爸爸、妈妈、儿子、女儿的家庭中生活。
    • 谢谢丹尼尔,很有帮助
    猜你喜欢
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 2017-05-31
    • 2014-08-16
    • 2013-02-10
    • 2016-05-07
    相关资源
    最近更新 更多