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

Python中Django 后臺(tái)自定義表單控件

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

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

其實(shí) 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)

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

在 django 中已經(jīng)提供了很多 widget(控件),然而這些還遠(yuǎn)遠(yuǎn)滿足不了我們的需求,這就需要我們?nèi)プ远x,下面就以一個(gè) ACE 插件 (ACE 是一個(gè)獨(dú)立的 JavaScript 編寫的基于 Web 的代碼編輯器)為例,說(shuō)說(shuō)怎么自定義 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)用的時(shí)候自定義代碼類型和樣式
    :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 方法,在這個(gè)方法中,對(duì)新的控件進(jìn)行包裝。

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" 對(duì)應(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)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

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

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

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

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

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

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

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

    基于Python如何使用AIML搭建聊天機(jī)器人

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

    詳解python中的 is 操作符

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

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

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

    python快速進(jìn)階利用Tkinter定制一個(gè)信息提示框

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

    Python黑魔法遠(yuǎn)程控制開機(jī)的實(shí)例

    這篇文章主要介紹了Python黑魔法遠(yuǎn)程控制開機(jī)的實(shí)例,文中有非常詳細(xì)的代碼示例,對(duì)正在學(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)用信息入庫(kù)

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

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

最新評(píng)論

新龙县| 齐河县| 洛宁县| 翁牛特旗| 黑水县| 临泽县| 阿尔山市| 华安县| 自治县| 屯留县| 凌海市| 定兴县| 西藏| 育儿| 皋兰县| 横山县| 教育| 麟游县| 盐边县| 雷山县| 金阳县| 武夷山市| 宜兴市| 绥江县| 鸡东县| 元江| 克拉玛依市| 娱乐| 六枝特区| 汕尾市| 香河县| 柳江县| 原平市| 贵定县| 繁峙县| 垦利县| 香河县| 昌黎县| 饶河县| 磐安县| 区。|