欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python中Django 后臺自定義表單控件

 更新時間:2017年03月28日 11:52:14   作者:與蟒唯舞  
本篇文章主要介紹了Python中Django 后臺自定義表單控件,其實 django 已經(jīng)為我們提供了一些可用的表單控件,比如:多選框、單選按鈕等,有興趣的開業(yè)了解一下。

在 django 中我們可以在 admin.py 中添加 ModelAdmin,這樣就能很方便地在后臺進行增刪改查的操作。然而,對應 Model 生成的表單,并不友好,我們希望能像前端開發(fā)一樣做出各種類型的控件,這就得對其后臺的表單進行自定義。

其實 django 已經(jīng)為我們提供了一些可用的表單控件,比如:多選框、單選按鈕等,下面就以單選按鈕為例:

# forms.py
from django import forms
from .models import MyModel

class MyForm(forms.ModelForm):
  xxx = forms.ChoiceField(choices=[...], widget=forms.RadioSelect())

  class Meta:
    model = MyModel
    fields = ['id', 'xxx']


# admin.py
from django.contrib import admin
from .models import MyModel
from .forms import MyForm

class MyAdmin(admin.ModelAdmin):
  form = MyForm
  # ...省略若干代碼

admin.site.register(MyModel, MyAdmin)

先自定義一個 MyForm,在里面為字段添加控件,widget 用來指定控件的類型,choices 指定可選列表,再在 MyAdmin 中的 form 指定為自定義表單即可。

在 django 中已經(jīng)提供了很多 widget(控件),然而這些還遠遠滿足不了我們的需求,這就需要我們?nèi)プ远x,下面就以一個 ACE 插件 (ACE 是一個獨立的 JavaScript 編寫的基于 Web 的代碼編輯器)為例,說說怎么自定義 widget:

#coding: utf-8
from django import forms
from django.utils.html import format_html
from django.forms.utils import flatatt
from django.utils.encoding import force_text
from django.utils.safestring import mark_safe


ACE_RENDER = '''
<script src="/static/js/jquery-1.11.2.min.js"></script>
<script src="/static/js/ace/ace.js"></script>
<script>
  $(function () {
    var textarea = $('textarea');
    var editDiv = $('<div>', {
      position: 'absolute',
      width: textarea.width(),
      height: textarea.height(),
      'class': textarea.attr('class')
    }).insertBefore(textarea);

    textarea.css('display', 'none');

    var editor = ace.edit(editDiv[0]);
    editor.getSession().setValue(textarea.val());
    editor.getSession().setMode("ace/mode/%s");
    editor.setTheme("ace/theme/%s");

    textarea.closest('form').submit(function () {
      textarea.val(editor.getSession().getValue());
    });
  });
</script>
'''

class AceWidget(forms.Textarea):
  def __init__(self, mode="", theme="", attrs=None):
    '''
    為了能在調(diào)用的時候自定義代碼類型和樣式
    :param mode:
    :param theme:
    :param attrs:
    :return:
    '''
    super(AceWidget, self).__init__(attrs)
    self.mode = mode
    self.theme = theme

  def render(self, name, value, attrs=None):
    '''
    關鍵方法
    :param name:
    :param value:
    :param attrs:
    :return:
    '''
    if value is None:
      value = ''
    final_attrs = self.build_attrs(attrs, name=name)
    output = [format_html('<textarea{}>\r\n{}</textarea>', flatatt(final_attrs), force_text(value))]
    current_ace_render = ACE_RENDER %(self.mode, self.theme)
    output.append(current_ace_render)
    return mark_safe('\n'.join(output))

主要就是自定義的 widget 要繼承自 django 的 widget,然后重寫 render 方法,在這個方法中,對新的控件進行包裝。

forms.py 中將自定義的控件 AceWidget 引入:

#coding: utf-8
from django import forms
from .models import Code
from widgets import AceWidget


class CodeForm(forms.ModelForm):
  code = forms.CharField(label='源碼', widget=AceWidget(attrs={'cols': '100', 'rows': '20'}, mode="python", theme="monokai"))

  class Meta:
    model = Code
    fields = ['title', 'code']

需要注意的是:在這里使用的 mode="python", theme="monokai" 對應的文件 mode-python.js theme-monokai.js 一定要在 /static/js/ace 目錄下。

效果圖

附錄:

models.py:

#coding:utf-8
from django.db import models


class Code(models.Model):
  title = models.CharField('標題', max_length=50, unique=True)
  code = models.TextField('源碼')

  class Meta:
    db_table = 'code'
    verbose_name = verbose_name_plural = '代碼'

  def __unicode__(self):
    return self.title

admin.py:

from django.contrib import admin
from .models import Code
from .forms import CodeForm


class CodeAdmin(admin.ModelAdmin):
  form = CodeForm
  list_display = ['id', 'title']

admin.site.register(Code, CodeAdmin)

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Python實現(xiàn)錄屏功能的示例代碼

    Python實現(xiàn)錄屏功能的示例代碼

    這篇文章主要為大家詳細介紹了如何利用Python實現(xiàn)錄屏功能,文中的示例代碼講解詳細,對我們掌握Python開發(fā)有一定的幫助,需要的可以參考一下
    2023-03-03
  • 舉例講解Python的lambda語句聲明匿名函數(shù)的用法

    舉例講解Python的lambda語句聲明匿名函數(shù)的用法

    匿名函數(shù)現(xiàn)在已經(jīng)成了各大編程語言爭相標配的熱門特性,無需用函數(shù)名來定義函數(shù)的方式在很多場合下書寫起來十分炫酷,這里我們就來舉例講解Python的lambda語句聲明匿名函數(shù)的用法
    2016-07-07
  • 利用Python批量壓縮png方法實例(支持過濾個別文件與文件夾)

    利用Python批量壓縮png方法實例(支持過濾個別文件與文件夾)

    這篇文章主要給大家介紹了關于利用Python批量壓縮png的相關資料,文中介紹的方法支持過濾個別文件與文件夾,文中通過示例代碼介紹的非常詳細,需要的朋友們下面跟著小編來一起看看吧。
    2017-07-07
  • Python獲取用戶輸入的方法詳解

    Python獲取用戶輸入的方法詳解

    在Python中,獲取用戶輸入是一個基礎且常見的操作,它允許程序與用戶進行交互,Python通過內(nèi)置的input()函數(shù)來實現(xiàn)這一功能,以下將詳細探討如何在Python中獲取用戶輸入,并涵蓋多個方面,需要的朋友可以參考下
    2024-09-09
  • python Hypothesis生成和執(zhí)行大量的測試用例

    python Hypothesis生成和執(zhí)行大量的測試用例

    Hypothesis是一個基于屬性的測試(property-based testing)庫,它能夠幫助我們生成和執(zhí)行大量的測試用例,與傳統(tǒng)的單元測試相比,屬性測試更加靈活和全面,能夠發(fā)現(xiàn)更多的邊界情況和潛在的錯誤
    2024-01-01
  • Tensorflow實現(xiàn)卷積神經(jīng)網(wǎng)絡用于人臉關鍵點識別

    Tensorflow實現(xiàn)卷積神經(jīng)網(wǎng)絡用于人臉關鍵點識別

    這篇文章主要介紹了Tensorflow實現(xiàn)卷積神經(jīng)網(wǎng)絡用于人臉關鍵點識別,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • Python?tkinter實現(xiàn)計算器功能

    Python?tkinter實現(xiàn)計算器功能

    這篇文章主要為大家詳細介紹了Python?tkinter實現(xiàn)計算器功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 最新評論