澳门正规赌博十大网站-澳门游戏网站
做最好的网站

后台自定义表单控件

Python中Django 后台自定义表单控件,pythondjango

在 django 中我们得以在 admin.py后台自定义表单控件。后台自定义表单控件。中添加ModelAdmin,那样就会非常低价地在后台举行增加和删除改查的操作。然则,对应 Model后台自定义表单控件。浮动的表单,并不和煦,大家愿意能像前端开垦同样做出各样类型的控件,那就得对其后台的表单进行自定义。

实则 django 已经为大家提供了一些可用的表单控件,譬喻:多选框、单选开关等,上边就以单选按键为例:

# 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 中早就提供了重重 widget(控件卡塔尔,不过那些还远远满意不断大家的需求,那就供给大家去自定义,上边就以一个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):
    '''
    为了能在调用的时候自定义代码类型和样式
    :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{}>rn{}</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.jstheme-monokai.js 一定要在 /static/js/ace目录下。

效果图

图片 1

附录:

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)

如上正是本文的全体内容,希望对我们的读书抱有助于,也指望咱们多多点拨帮客之家。

后台自定义表单控件,pythondjango 在 django 中大家得以在 admin.py 中增添 ModelAdmin ,那样就会异常的低价地在后台进行增加和删除改查的操作...

django MTV模式之----template模版

django是动态的网页,后台的多寡须求动态的插入到前端中,此时就依附于django的template模版框架。django支持二种模板框架,上面介绍django自带的。

自带的模版语言能够在django模版中插入一些简短的代码和逻辑,举例变量,逻辑剖断等。上边是有的模板的根基效法:(在html代码中插入该模版标签)

变量:

{{result}}

if判断

{%if%}
{%endif%}

循环for

{%for%}
{%endfor%}

过滤器(用于变量转变卡塔尔(英语:State of Qatar)
事例:使变量输出为时间格式

{{ item.publishtime|date:'Y-m-d H:i:s' }}

django有多量的过滤器来拍卖前端的来得,具体可参照:

后台view会将数据传递给前台模版,交给前台模版去渲染。

django MTV模式之----view

views.py是django中python后台处理的最重要逻辑代码之处,常常的话每采访两个网页,会对url举办相称,这时候会调用相应的views(实际便是四个python的自定义函数),之后view里面包车型客车函数对数码通过管理未来回到给前端。

二个view轻便例子:

def blogmanager(request):
  results = BlogList.objects.all().order_by('-time')
  context = {'results': results}
  return render(request, 
                'bloglist/blogmanager.html', context)

在view中用get方法赢得前端提交的表单音讯:

  dayfrom = request.GET.get("dayfrom", "")
  dayto = request.GET.get("dayto", "")
  filterresult = request.GET.get("result", "")

在views中直接重返文本

return HttpResponse("disabled account")

在view中打开页面跳转

HttpResponseRedirect('/file/test/')

在view里再次回到数据给前台渲染,传递的context变量能够是字典的数据类型

return render(request, 'blog/publishlist.html', context)

django----url匹配

urls.py是布署访谈相应url对应哪个views去管理之处。django的url格式依旧比较高雅和精炼的,而且协理正则表明式。

url配置写法例子如下:

from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
   url(r'^$', 'blog.views.home', name='home'),
   url(r'^record/(d )/', 'blog.views.record', name='record'),
   url(r'^stats/(S )/', 'blog.views.stats', name='stats'),
)

url标签,定义name,在views里面加一个name="",name能够写在模板里,那样不用写死url地址。

url(r'^blogmanager/index$', 'sjzs.views.blogmanager', name='blogmanager'),

<a class="brand" href="{%url 'blogmanager'%}">博客信息一览</a>

不过这一个名号是大局唯生龙活虎的,无法再一次。

url.py嵌套,在django工程目录下有个url.py,别的在各自的接纳目录下也能够成立三个url.py,然后在工程目录的url.py中丰富一句include,那样有个别应用url的极度就足以切实写在采纳目录下的url.py,如下:

url(r'^subblog/', include('subblog.urls'))

url 参数,django帮忙从url中赢得参数

url(r'^record/(d )/', 'blog.views.record', name='record'),

本文由澳门正规赌博十大网站发布于澳门游戏网站,转载请注明出处:后台自定义表单控件