0

基本的に Node クラスを定義する次のクラスを定義しています。各ノードには、複数の NodeIntf を割り当てることができます。各 NodeIntf には、複数の NodeIntfIpaddr を割り当てることができます。これらの NodeIntfIpaddr の 1 つは、Node オブジェクトの mgmt_ipaddr 属性として割り当てられる可能性があります。そして、そのうちの 1 つが mgmt_ipaddr_v6 属性に割り当てられている可能性があります。現在、私のテンプレートには、基本的にインターフェイス用のネストされたテーブルがあり、ラジオ ボタン セレクターを使用して、Node オブジェクトの mgmt_ipaddr(_v6) 属性に対して選択されている ipaddr を選択したいと考えていますが、よくわかりません。どうやってするの。ipaddr_formset を反復処理するときに、その ipaddr が選択した mgmt_ipaddr を表しているかどうかを確認する必要があると思いますが、その方法がわかりません。どんな助けでも大歓迎です。

class Node(models.Model):
    name = models.CharField(max_length=64, primary_key=True)
    mgmt_ipaddr = models.ForeignKey('NodeIntfIpaddr', null=True, on_delete=models.SET_NULL)
    mgmt_ipaddr_v6 = models.ForeignKey('NodeIntfIpaddr', null=True, on_delete=models.SET_NULL)

class NodeIntf(models.Model):
    intf = models.CharField(max_length=32)
    node = models.ForeignKey('Node', on_delete=models.CASCADE)
    class Meta:
        unique_together = ('node', 'intf')

class NodeIntfIpaddr(models.Model):
   node_intf = models.ForeignKey('NodeIntf', on_delete=models.CASCADE)
   ipaddr = InetAddressField()
   class Meta:
       unique_together = ('node_intf', 'ipaddr')

class NodeForm(ModelForm):
    class Meta:
        model = Node

class NodeIntfForm(ModelForm):
    class Meta:
        model = NodeIntf

class NodeIntfIpAddrForm(ModelForm):
    class Meta:
        model = NodeIntfIpaddr

NodeIntfIpaddrFormSet = modelformset_factory(NodeIntfIpaddr,
    form=NodeIntfIpAddrForm, extra=0)

class BaseNodeIntfFormSet(BaseInlineFormSet):
    def add_fields(self, form, index):
        super(BaseNodeIntfFormSet, self).add_fields(form, index)
        instance = self.get_queryset()[index]
        pk_value = instance.pk
        form.ipaddr_formset = NodeIntfIpaddrFormSet(
            queryset=NodeIntfIpaddr.objects.filter(node_intf=pk_value),
            prefix='INTF_%s' % pk_value)

NodeIntfFormSet = inlineformset_factory(Node, NodeIntf,
    form=NodeIntfForm, formset=BaseNodeIntfFormSet, extra=0)

class NodeUpdateView(UpdateView):
    form_class = NodeForm
    model = Node
    def get_context_data(self, **kwargs):
        c = super(NodeUpdateView, self).get_context_data(**kwargs)
        node = self.get_object()
        c['action'] = reverse('node-update', kwargs={'pk': node.name})
        if self.request.POST:
            node_intfs = NodeIntfFormSet(self.request.POST, instance=node)
            if node_intfs.is_valid():
                addrs = node_intfs.save_all()
        else:
            node_intfs = NodeIntfFormSet(instance=node)
        c['node_intfs_formset'] = node_intfs
        return c

テンプレート スニペット:

  <table class='node_intfs'>
      <thead>
        <tr class='node_intf'>
          <th colspan='2'></th>
          <th>Name</th>
          <th></th>
        </tr>
        <tr class='node_intf_ipaddr'>
          <th>IPv4 Mgmt<br><label><input type='radio' name='mgmt_ipaddr' value=''{{ node.mgmt_ipaddr|yesno:', checked' }}>None</label></th>
          <th>IPv6 Mgmt<br><label><input type='radio' name='mgmt_ipaddr_v6' value=''{{ node.mgmt_ipaddr_v6|yesno:', checked' }}>None</label></th>
          <th colspan='2'></th>
        </tr>
      </thead>
      <tbody>
{% for node_intf_form in node_intfs_formset %}
        <tr class='node_intf'>
          <td colspan='2'></td>
          <td>{{ node_intf_form.intf }}</td>
          <td></td>
        </tr>
{% if node_intf_form.ipaddr_formset %}
{% for ipaddr_form in node_intf_form.ipaddr_formset %}
        <tr class='node_intf_ipaddr'>
          <td>TODO</td>                                  <---- These are what I can't figure out
          <td>TODO</td>                                  <---- These are what I can't figure out
          <td></td>
          <td>{{ ipaddr_form.ipaddr }}</td>
        </tr>
{% endfor %}
{% endif %}
{% endfor %}
      </tbody>
    </table>
4

1 に答える 1