最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

在 django 中我們可以在 admin.py 中添加 ModelAdmin,這樣就能很方便地在后臺進行增刪改查的操作。然而,對應(yīng) 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):
    '''
    關(guān)鍵方法
    :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" 對應(yīng)的文件 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('標(biāo)題', 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)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python之字符串的遍歷的4種方式

    Python之字符串的遍歷的4種方式

    這篇文章主要介紹了Python之字符串的遍歷的4種方式,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • tensorflow轉(zhuǎn)onnx的實現(xiàn)方法

    tensorflow轉(zhuǎn)onnx的實現(xiàn)方法

    本文主要介紹了tensorflow轉(zhuǎn)onnx的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • python lambda函數(shù)及三個常用的高階函數(shù)

    python lambda函數(shù)及三個常用的高階函數(shù)

    這篇文章主要介紹了python lambda函數(shù)及三個常用的高階函數(shù),本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • 基于Python如何使用AIML搭建聊天機器人

    基于Python如何使用AIML搭建聊天機器人

    AIML,全名為Artificial Intelligence Markup Language(人工智能標(biāo)記語言),是一種創(chuàng)建自然語言軟件代理的XML語言,是由Richard Wallace和世界各地的自由軟件社區(qū)在1995年至2002年發(fā)明的,通過本文給大家介紹基于Python如何使用AIML搭建聊天機器人,需要的朋友一起學(xué)習(xí)
    2016-01-01
  • 詳解python中的 is 操作符

    詳解python中的 is 操作符

    is 操作符是Python語言的一個內(nèi)建的操作符。它的作用在于比較兩個變量是否指向了同一個對象。下面通過本文給大家詳細介紹python中的 is 操作符,需要的朋友參考下吧
    2017-12-12
  • django?python?獲取當(dāng)天日期的方法

    django?python?獲取當(dāng)天日期的方法

    這篇文章主要介紹了django?python?獲取當(dāng)天日期,在Python中,你可以使用datetime模塊來獲取當(dāng)前日期,本文結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-05-05
  • python快速進階利用Tkinter定制一個信息提示框

    python快速進階利用Tkinter定制一個信息提示框

    這篇文章主要介紹了python快速進階利用Tkinter定制一個信息提示框,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • Python黑魔法遠程控制開機的實例

    Python黑魔法遠程控制開機的實例

    這篇文章主要介紹了Python黑魔法遠程控制開機的實例,文中有非常詳細的代碼示例,對正在學(xué)習(xí)python的小伙伴們有很大的幫助,需要的朋友可以參考下
    2021-04-04
  • Window環(huán)境下Scrapy開發(fā)環(huán)境搭建

    Window環(huán)境下Scrapy開發(fā)環(huán)境搭建

    這篇文章主要介紹了Window環(huán)境下Scrapy開發(fā)環(huán)境搭建,需要的朋友可以參考下
    2018-11-11
  • 基于python3抓取pinpoint應(yīng)用信息入庫

    基于python3抓取pinpoint應(yīng)用信息入庫

    這篇文章主要介紹了基于python3抓取pinpoint應(yīng)用信息入庫,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01

最新評論

克山县| 瑞安市| 绵阳市| 藁城市| 寿宁县| 乾安县| 肥城市| 临城县| 时尚| 元江| 延安市| 区。| 绿春县| 涿鹿县| 奎屯市| 温泉县| 泗洪县| 交城县| 双桥区| 沭阳县| 濮阳市| 呼图壁县| 叶城县| 安溪县| 西乌珠穆沁旗| 龙井市| 桐庐县| 蚌埠市| 炎陵县| 手机| 石楼县| 前郭尔| 绍兴县| 花垣县| 敦煌市| 竹北市| 科技| 丹东市| 泾源县| 恩施市| 中牟县|