Django m2m 关系问题
Django m2m relationship problems
我不是 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 的视图:
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>
当我创建狗实例时,我 select 主人在一个盒子里。
table 没问题,除了 "dog.owner" 它显示为 None。
我错过了什么?
您在视图中分配 dog.user
,但该字段名为 owner
。
但是,我不认为您需要此处的多对多字段。这意味着一条狗有很多主人,也意味着您需要在模板中迭代 dog.owner.all
。我认为你想要一个简单的 ForeignKey,在这种情况下你可以做 dog.owner = self.request.user
然后像你已经做的那样输出它。
编辑 如果确定,则需要将当前用户添加到列表 的所有者:dog.owner.add(self.request.user)
。而且,正如我所说,在你的显示模板中你不能只显示 "the owner" 因为有很多:你需要 iterate over dog.owner.all
并显示名称每一个。
我不是 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 的视图:
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>
当我创建狗实例时,我 select 主人在一个盒子里。 table 没问题,除了 "dog.owner" 它显示为 None。 我错过了什么?
您在视图中分配 dog.user
,但该字段名为 owner
。
但是,我不认为您需要此处的多对多字段。这意味着一条狗有很多主人,也意味着您需要在模板中迭代 dog.owner.all
。我认为你想要一个简单的 ForeignKey,在这种情况下你可以做 dog.owner = self.request.user
然后像你已经做的那样输出它。
编辑 如果确定,则需要将当前用户添加到列表 的所有者:dog.owner.add(self.request.user)
。而且,正如我所说,在你的显示模板中你不能只显示 "the owner" 因为有很多:你需要 iterate over dog.owner.all
并显示名称每一个。