使用Bootstrap的其他模型形式中的ManyToManyField的问题

2024-06-16 11:11:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我想显示可能的选择,从ManyToManyField(我有在家模型)在业主的形式。我有业主<;--Many2Many--gt;家,拥有定制类业主。在家里,它是开箱即用的,我不知道如何让它在业主那里工作。

我正在使用Django2.2.4和Bootstrap4和Postgresql。我基于django bookshelf项目(也就是django和Bootstrap4)开始了我的项目。我不使用任何渲染。django bookshelf项目中的注释提到了How to add bootstrap class to Django CreateView form fields in the template?,所以如果它符合表单,我就坚持使用它。你知道吗

一般来说,我对Python(Django也是)和web技术相当陌生。我在谷歌上搜索了十几个不同的问题/答案,但我找不到任何关于什么是什么以及如何在现实生活中使用它的好解释。它们中的大多数最终都有了基本的用法。你知道吗

我自己做了一些实验,但到目前为止没有成功。。。你知道吗



这是代码

我有两个模型-房子/型号.py所有者/型号.py

家庭/型号.py:

class Homes(models.Model):
   id = models.AutoField(primary_key=True)
   # other fields
   some_owners = models.ManyToManyField(Owners, through='HomesOwners', through_fields=('id_home', 'id_owner'), related_name='some_owners')
   # end of fields, some other code in the class like "class Meta" etc.

class HomesOwners(models.Model):
   id = models.AutoField(primary_key=True)
   id_home = models.ForeignKey(Homes, models.DO_NOTHING, db_column='id_home')
   id_owner = models.ForeignKey('owners.Owners', models.DO_NOTHING, db_column='id_owner')

所有者/型号.py没有什么特别的,没有从我家进口的/型号.py等等


以及我的表格:

家庭/表单.py

class HomesForm(forms.ModelForm):
   def __init__(self, *args, **kwargs):
      super(HomesForm, self).__init__(*args, **kwargs)
      self.fields['some_field_from_homes_model'].widget.attrs = {'class': 'form-control '}
      #
      # --> no need self.fields for M2M, Django does the work
      #
      # but I tried also and have a --> Question 2
      # self.fields["some_owners"].widget = forms.widgets.CheckboxSelectMultiple()
      # self.fields["some_owners"].queryset = HomesOwners.objects.all()

没有任何代码自选字段“对于M2M字段,Django能够为我生成所有者列表。你知道吗



问题1

我想在我的业主表格中获得房屋的列表。你知道吗

我不知道要补充什么。我想我不能补充

# Owners/models.py
some_homes = models.ManyToManyField(Homes, through='HomesOwners', through_fields=('id_home', 'id_owner'), related_name='some_homes')

因为循环进口,对吗?你知道吗

如何使用自我保护领域? 我需要在代码中添加什么?你知道吗



问题2

当我加上

# Homes/forms.py
self.fields["some_owners"].widget = forms.widgets.CheckboxSelectMultiple()
self.fields["some_owners"].queryset = HomesOwners.objects.all()

我得到了

<!-- html page -->
HomesOwners object (1)
HomesOwners object (2)
<!-- and so on... -->

我怎么能只列出所有者? 如何过滤/排序它们,使它们首先显示为未连接到任何家庭?你知道吗



问题3

class HomesOwners(models.Model):
   id = models.AutoField(primary_key=True)
   id_home = models.ForeignKey(Homes, models.DO_NOTHING, db_column='id_home')
   id_owner = models.ForeignKey('owners.Owners', models.DO_NOTHING, db_column='id_owner')

def __str__(self):
   return pass #return something

我脑子都想不起来了。这个类连接家庭业主。当我想到房子时,我想归还拥有者,反之亦然。所以它应该根据我们使用的对象(家或所有者)返回不同的东西。我想这和我的第二个问题有关:

HomesOwners object (1)

还有。。。你知道吗

主页.html我是这样使用M2M的:

{% for owner in homes.homesowners_set.all %}
{{ owner.id_owner.id }}
{% endfor %}

我想写一些类似我的所有者.html并列出住宅。这是连接到我的前一个问题,我想有完整的答案,如果可能的话。你知道吗

编辑

有了给我的答案,我就可以把家添加到OwnerUpdate视图中。我有这样的看法: 所有者/视图.py

# List View
class OwnersList(ListView):
    model = Owners

# Detail View
class OwnersView(DetailView):
    model = Owners

# Create View
class OwnersCreate(CreateView):
    model = Owners
    form_class = OwnersForm
    # Setting returning URL
    success_url = reverse_lazy('owners_list')

# Update View
class OwnersUpdate(UpdateView):
    model = Owners
    form_class = OwnersForm
    success_url = reverse_lazy('owners_list')

# Delete View
class OwnersDelete(DeleteView):
    model = Owners
    success_url = reverse_lazy('owners_list')

我需要做什么改变才能在业主名单上显示他们拥有的房子? 在家庭详细视图中,我可以显示所有者。我想对Homes的DetailView和Homes的ListView做同样的操作。你知道吗


Tags: pyselfidfieldshomemodelmodelssome
1条回答
网友
1楼 · 发布于 2024-06-16 11:11:26

我真的不明白你的要求,
但如果我没弄错你的问题,
我假设您想将房屋列表(不是房屋所有者列表)添加到您的所有者表单中,对吗?你知道吗

您可以在表单中添加如下额外字段:

class OwnersForm(ModelForm):
    # notice the queryset is 'Homes' not 'HomesOwners'
    homes = forms.ModelMultipleChoiceField(queryset=Homes.objects.all(), widget=forms.CheckboxSelectMultiple)

    class Meta:
        model = Owners
        fields = ('homes', 'your_other_fields',)

    # then you can access in init function too if you want
    def __init__(self, *args, **kwargs):
        super(OwnersForm, self).__init__(*args, **kwargs)
        self.fields['homes'].required = False

然后,由于它使用CheckboxSelectMultiple小部件,因此可以在html模板中迭代它,如下所示:

{% for key, value in your_form.homes.field.choices %} <!  notice '.field.' >
{{ key }} = {{ value }}
{% endfor %}

您可能还需要为窗体创建自定义保存。你知道吗


对于你的问题3,它不是关于形式?
如果你想向房主展示,你已经做得很好了。

{% for owner in homes.homesowners_set.all %}
{{ owner.id_owner.id }}
{% endfor %}

但是如果homes仅仅是一个对象,它就会工作。
如果homes是一个查询集,则必须首先迭代它

{% for home in homes %}
    {% for owner in home.homesowners_set.all %}
    {{ owner.id_owner.id }}
    {% endfor %}
{% endfor %}

抱歉,如果我误解了您的问题,
也许你也可以提供你的views.py,这样我或其他人可以帮助你更具体

相关问题 更多 >