返回文章列表

Django 通用檢視整合 DHCP 位址管理

本文介紹如何使用 Django 的 URL 模式、範本繼承和通用檢視來構建 DHCP 位址管理應用程式,並整合客戶端分類別功能。文章涵蓋了 URL 模式設計、資料模型擴充、範本繼承的應用,以及如何使用通用檢視簡化程式碼,實作物件的顯示、新增、修改和刪除等功能。透過整合這些技術,可以有效地管理 DHCP

Web 開發 後端開發

在網路管理中,DHCP 位址管理至關重要。本文介紹如何利用 Django 框架的 URL 模式、範本繼承和通用檢視來開發一個功能完善的 DHCP 位址管理應用程式,並加入客戶端分類別功能,提升位址池的使用效率。首先,我們設計了清晰的 URL 模式,將不同的操作對映到對應的檢視函式,方便使用者存取和管理網路位址資源。接著,我們擴充了資料模型,加入了客戶端分類別規則,以便根據客戶端型別分配 IP 位址。為了保持介面一致性,我們使用了範本繼承機制,讓所有頁面共用相同的選單結構。最後,我們利用 Django 的通用檢視,簡化了程式碼,快速實作了物件的顯示、新增、修改和刪除等功能,提升了開發效率。

將 IP 位址應用程式與 DHCP 整合

網路位址 URL 模式

在 Django 專案中,所有 URL 模式名稱都在 URLConfig 檔案中定義。以下範例展示了網路位址的 URL 模式:

urlpatterns = patterns('',
    url(r'^networkaddress/$', views.networkaddress_display, name='networkaddress-displaytop'),
    url(r'^networkaddress/add/$', views.networkaddress_add, name='networkadd-top'),
    url(r'^networkaddress/(?P<address>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2})/$', 
        views.networkaddress_display, name='networkaddress-display'),
    url(r'^networkaddress/(?P<address>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2})/delete/$', 
        views.networkaddress_delete, name='networkaddress-delete'),
    url(r'^networkaddress/(?P<address>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2})/add/$', 
        views.networkaddress_add, name='networkaddress-add'),
    url(r'^networkaddress/(?P<address>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2})/modify/$', 
        views.networkaddress_modify, name='networkaddress-modify'),
)

內容解密:

此程式碼定義了網路位址管理的 URL 模式。每一行 url 都對應一個特定的 URL 路徑,並將其對映到相應的檢視函式。name 引數為每個 URL 模式提供了一個唯一的名稱,方便在範本和檢視中參照。這些 URL 模式涵蓋了網路位址的顯示、新增、刪除和修改等操作。

新增客戶端分類別功能

為了更好地利用位址池,我們需要實作客戶端分類別功能。這意味著我們需要定義一些規則來識別傳送請求的客戶端,並根據這些規則從適當的位址池中分配 IP 位址。

資料模型的擴充

我們需要為新的資料模型定義類別,並在 DHCPAddressPool 類別中新增一個外部索引鍵來參照 ClassRule 物件。

class DHCPAddressPool(models.Model):
    dhcp_network = models.ForeignKey(DHCPNetwork)
    class_rule = models.ForeignKey(ClassRule)
    range_start = models.IPAddressField()
    range_finish = models.IPAddressField()

    def __unicode__(self):
        return "(%s - %s)" % (self.range_start, self.range_finish)

class ClassRule(models.Model):
    rule = models.TextField()
    description = models.CharField(max_length=400)

    def __unicode__(self):
        return self.id

內容解密:

此程式碼定義了 DHCPAddressPoolClassRule 兩個資料模型。DHCPAddressPool 模型用於表示 DHCP 位址池,它包含了起始和結束 IP 位址,以及對應的 ClassRule 物件。ClassRule 模型用於表示客戶端分類別規則,它包含了規則文字和描述。

範本繼承

為了使規則管理頁面在所有頁面中都可存取,我們使用了 Django 的範本繼承機制。我們定義了一個基礎範本 base.html,並在其中定義了兩個區塊:menucontents

<!-- base.html -->
{% block menu %}
<ul>
    <li><a href="{% url 'networkaddress-displaytop' %}">網路位址管理</a></li>
    <li><a href="{% url 'classrule-displaytop' %}">客戶端分類別規則管理</a></li>
</ul>
{% endblock %}
<hr/>
{% block contents %}
{% endblock %}
<!-- display.html -->
{% extends "base.html" %}

{% block contents %}
<!-- 原始的 display.html 內容 -->
{% endblock %}

內容解密:

此程式碼展示瞭如何使用 Django 的範本繼承機制。base.html 範本定義了兩個區塊:menucontentsdisplay.html 範本繼承了 base.html,並重寫了 contents 區塊。這樣,display.html 就具有了與 base.html 一致的選單和內容結構。

將 IP 位址應用程式與 DHCP 整合

類別規則管理

為了讓所有 DHCP 集區共用相同的規則集,我們需要在將特定規則指派給任何 DHCP 集區之前,先定義該規則。這樣做的好處是,使用者可以重複使用現有的規則。如果規則在許多不同的子網路中重複使用,這種方法很好。然而,如果規則是特定的,且不太可能被重複使用,那麼這種方法就不是最好的,因為你最終會得到大量的一次性條目,列表很快就會變得難以管理。

如果屬於後者的情況,你可能會想要考慮為規則和子網路定義類別,以便它們可以自動分組。然後,當你建立新的 DHCP 網路時,你可以選擇你想要檢視的類別。

通用檢視

通用檢視是指對傳遞給它們的任何物件執行基本和常見任務的檢視。Django 提供了四種型別的通用檢視:

  • 重定向到其他頁面或呈現任何給定範本(通常是靜態內容)的檢視。
  • 生成物件列表或顯示任何特定物件的詳細資訊的檢視。
  • 根據物件的建立日期列出物件的檢視。如果您正在建立部落格或新聞網站,這些檢視會更有用。
  • 新增、刪除和修改物件的檢視。

通用檢視可以從 django.views.generic 函式庫中匯入。通常,您需要在 URL 組態檔案中使用它們,因為這是將 URL 對映到檢視的地方。

使用通用檢視顯示物件列表

首先,讓我們呼叫一個通用檢視來顯示所有可用的類別規則物件列表。使用通用類別檢視的最佳方式是建立一個自定義類別,繼承自通用類別,定義一些指定其行為的引數(例如範本名稱、模型類別名稱),然後在 urls.py 中使用該類別。

# views.py
from django.views.generic import ListView
from .models import ClassRule

class ClassRuleDisplay(ListView):
    model = ClassRule
    template_name = 'display_classrule.html'
# urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('classrule/', views.ClassRuleDisplay.as_view(), name='classrule_displaytop'),
]

建立顯示物件列表的範本

接下來,我們需要建立一個範本來漂亮地顯示所有物件。我們已經新增了指向詳細資訊、修改和刪除功能的連結,我們將在下一節中定義這些功能。

<!-- display_classrule.html -->
{% extends "base.html" %}

{% block contents %}
<h1>所有類別規則列表</h1>
{% if object_list %}
<ul>
    {% for rule in object_list %}
    <li>{{ rule.description }}
        ( <a href="{% url 'classrule_display' rule.id %}">詳細資訊</a> |
        <a href="{% url 'classrule_modify' rule.id %}">修改</a> |
        <a href="{% url 'classrule_delete' rule.id %}">刪除</a> )
    </li>
    {% endfor %}
</ul>
{% else %}
尚未定義任何類別規則。
{% endif %}
<h3><a href="{% url 'classrule_add' %}">新增規則</a></h3>
{% endblock %}

使用通用檢視顯示物件的詳細資訊

類別似地,我們將使用通用檢視來顯示有關任何特定類別規則物件的詳細資訊。唯一的區別是,我們需要將特定的物件 ID 傳遞給通用檢視,以便檢視程式碼可以從列表中選擇適當的物件。

# views.py
from django.views.generic import DetailView
from .models import ClassRule

class ClassRuleDetailDisplay(DetailView):
    queryset = ClassRule.objects.all()
    template_name = 'display_classrule_detail.html'

    def get_object(self):
        object = super(ClassRuleDetailDisplay, self).get_object()
        return object
# urls.py
from django.urls import path
from . import views

urlpatterns = [
    # ...
    path('classrule/<pk>/', views.ClassRuleDetailDisplay.as_view(), name='classrule_display'),
]

詳細資訊範本

您需要建立一個新的範本 display_classrule_detail.html 來顯示物件的詳細資訊。

<!-- display_classrule_detail.html -->
{% extends "base.html" %}

{% block contents %}
<h1>類別規則詳細資訊</h1>
<p>描述:{{ object.description }}</p>
<!-- 其他欄位 -->
{% endblock %}

內容解密:

  • 在上述程式碼中,我們使用了 Django 的通用檢視來顯示物件列表和物件的詳細資訊。
  • ListViewDetailView 是 Django 提供的通用檢視,用於顯示物件列表和物件的詳細資訊。
  • 我們建立了自定義類別 ClassRuleDisplayClassRuleDetailDisplay,繼承自 ListViewDetailView,並定義了 modeltemplate_name 屬性。
  • urls.py 中,我們將 URL 對映到我們的自定義檢視類別。
  • 我們建立了範本來顯示物件列表和物件的詳細資訊。
  • display_classrule.html 範本中,我們使用了 Django 的範本語言來迴圈遍歷物件列表,並顯示每個物件的描述和操作連結。
  • display_classrule_detail.html 範本中,我們使用了 Django 的範本語言來顯示物件的詳細資訊。

將 IP 位址應用程式與 DHCP 整合

使用通用檢視來顯示、新增、修改和刪除物件

在 Django 中,通用檢視可以用於處理常見的檢視邏輯,例如顯示物件清單或單一物件的詳細資訊、新增、更新和刪除物件。本文將介紹如何使用通用檢視來實作這些功能。

顯示物件清單和詳細資訊

要顯示物件清單和詳細資訊,可以使用 DetailView。首先,需要定義一個 DetailView 類別,並指定要使用的模型和範本。

from django.views.generic import DetailView
from .models import ClassRule

class ClassRuleDetailDisplay(DetailView):
    model = ClassRule
    template_name = 'classrule_detail.html'

在 URL 規則中,需要指定 pk 引數來告訴通用檢視要檢索哪個物件。

from django.urls import path
from . import views

urlpatterns = [
    path('classrule/<int:pk>/', views.ClassRuleDetailDisplay.as_view(), name='classrule_display'),
]

在範本中,可以使用 object 變數來存取物件的屬性。

{% extends "base.html" %}

{% block contents %}
  {% if object %}
    <h1>Class Rules 詳細資訊</h1>
    <ul>
      <li>ID: {{ object.id }}</li>
      <li>描述: {{ object.description }}</li>
      <li>規則文字:
        <pre>
          {{ object.rule }}
        </pre>
      </li>
    </ul>
  {% else %}
    <h1>Class Rules 清單</h1>
    {% if object_list %}
      <ul>
        {% for rule in object_list %}
          <li>{{ rule.description }}
            ( <a href="{% url 'classrule_display' rule.id %}">詳細資訊</a> |
              <a href="{% url 'classrule_modify' rule.id %}">修改</a> |
              <a href="{% url 'classrule_delete' rule.id %}">刪除</a> )
          </li>
        {% endfor %}
      </ul>
    {% else %}
      尚未定義任何 Class Rules。
    {% endif %}
    <h3><a href="{% url 'classrule_add' %}">新增規則</a></h3>
  {% endif %}
{% endblock %}

新增和修改物件

要新增和修改物件,可以使用 CreateViewUpdateView。首先,需要定義一個表單類別來處理物件的建立和更新。

from django import forms
from .models import ClassRule

class ClassRuleForm(forms.ModelForm):
    class Meta:
        model = ClassRule
        fields = ('rule', 'description')

然後,可以定義 CreateViewUpdateView 類別來處理物件的新增和更新。

from django.views.generic import CreateView, UpdateView
from .models import ClassRule
from .forms import ClassRuleForm

class ClassRuleCreate(CreateView):
    form_class = ClassRuleForm
    template_name = 'add.html'

class ClassRuleUpdate(UpdateView):
    model = ClassRule
    form_class = ClassRuleForm
    template_name = 'add.html'

在 URL 規則中,需要指定 pk 引數來告訴通用檢視要更新哪個物件。

from django.urls import path
from . import views

urlpatterns = [
    path('classrule/add/', views.ClassRuleCreate.as_view(), name='classrule_add'),
    path('classrule/<int:pk>/modify/', views.ClassRuleUpdate.as_view(), name='classrule_modify'),
]

刪除物件

要刪除物件,可以使用 DeleteView。首先,需要定義一個 DeleteView 類別,並指定要使用的模型和範本。

from django.views.generic import DeleteView
from .models import ClassRule

class ClassRuleDelete(DeleteView):
    model = ClassRule
    success_url = reverse_lazy('classrule_displaytop')
    template_name = 'delete_confirm_classrule.html'

在 URL 規則中,需要指定 pk 引數來告訴通用檢視要刪除哪個物件。

from django.urls import path
from . import views

urlpatterns = [
    path('classrule/<int:pk>/delete/', views.ClassRuleDelete.as_view(), name='classrule_delete'),
]

在範本中,需要提供一個確認表單來確認刪除動作。

<form method="post" action=".">
  <p>您確定要刪除嗎?</p>
  <input type="submit" />
</form>

程式碼解析

上述程式碼展示瞭如何使用 Django 的通用檢視來實作物件的顯示、新增、修改和刪除。以下是一些重要的觀念:

  • 使用 DetailView 來顯示物件的詳細資訊。
  • 使用 CreateViewUpdateView 來處理物件的新增和更新。
  • 使用 DeleteView 來處理物件的刪除。
  • 需要在 URL 規則中指定 pk 引數來告訴通用檢視要操作哪個物件。
  • 需要定義表單類別來處理物件的建立和更新。