Maison > développement back-end > Tutoriel Python > Exemple détaillé de contrôle de formulaire personnalisé en arrière-plan Django en Python

Exemple détaillé de contrôle de formulaire personnalisé en arrière-plan Django en Python

Y2J
Libérer: 2017-04-28 09:37:28
original
2004 Les gens l'ont consulté

Cet article présente principalement les contrôles de formulaire personnalisés backend de Django en Python. En fait, Django nous a fourni certains contrôles de formulaire disponibles, tels que les zones de sélection multiple, les boutons radio, etc. Si vous êtes intéressé, consultez-le.

Dans Django, nous pouvons ajouter admin.py à ModelAdmin, afin de pouvoir facilement ajouter, supprimer, modifier et vérifier en arrière-plan. Cependant, le formulaire généré correspondant à Model n'est pas convivial. Nous espérons effectuer différents types de contrôles comme le développement front-end, nous devons donc personnaliser le formulaire backend.

En fait, Django nous a fourni certains contrôles de formulaire disponibles, tels que des cases de sélection multiple, des boutons radio, etc. Prenons l'exemple des boutons radio :

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

# 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)

Copier après la connexion

Définir d'abord a MyForm et ajoutez des contrôles pour les champs widget est utilisé pour spécifier le type de contrôle choices spécifie la liste facultative. Spécifiez ensuite le formulaire dans MyAdmin comme formulaire personnalisé.

Django a fourni beaucoup de widgets (contrôles), mais ceux-ci sont loin de répondre à nos besoins, ce qui nous oblige à les personnaliser. Voici un plug-in ACE (ACE est un JavaScript indépendant (basé sur le Web). éditeur de code écrit par (Éditeur de code basé sur le Web)) à titre d'exemple, parlons de la façon de personnaliser le widget :

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

#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 = $(&#39;textarea&#39;);

    var editp = $(&#39;<p>&#39;, {

      position: &#39;absolute&#39;,

      width: textarea.width(),

      height: textarea.height(),

      &#39;class&#39;: textarea.attr(&#39;class&#39;)

    }).insertBefore(textarea);

 

    textarea.css(&#39;display&#39;, &#39;none&#39;);

 

    var editor = ace.edit(editp[0]);

    editor.getSession().setValue(textarea.val());

    editor.getSession().setMode("ace/mode/%s");

    editor.setTheme("ace/theme/%s");

 

    textarea.closest(&#39;form&#39;).submit(function () {

      textarea.val(editor.getSession().getValue());

    });

  });

</script>

&#39;&#39;&#39;

 

class AceWidget(forms.Textarea):

  def __init__(self, mode="", theme="", attrs=None):

    &#39;&#39;&#39;

    为了能在调用的时候自定义代码类型和样式

    :param mode:

    :param theme:

    :param attrs:

    :return:

    &#39;&#39;&#39;

    super(AceWidget, self).__init__(attrs)

    self.mode = mode

    self.theme = theme

 

  def render(self, name, value, attrs=None):

    &#39;&#39;&#39;

    关键方法

    :param name:

    :param value:

    :param attrs:

    :return:

    &#39;&#39;&#39;

    if value is None:

      value = &#39;&#39;

    final_attrs = self.build_attrs(attrs, name=name)

    output = [format_html(&#39;<textarea{}>\r\n{}</textarea>&#39;, flatatt(final_attrs), force_text(value))]

    current_ace_render = ACE_RENDER %(self.mode, self.theme)

    output.append(current_ace_render)

    return mark_safe(&#39;\n&#39;.join(output))

Copier après la connexion

L'essentiel est que le widget personnalisé hérite du widget django, et puis réécrivez la méthode de rendu Dans cette méthode, enveloppez le nouveau contrôle.

Introduire le contrôle personnalisé forms.py dans AceWidget :

1

2

3

4

5

6

7

8

9

10

11

12

#coding: utf-8

from django import forms

from .models import Code

from widgets import AceWidget

 

 

class CodeForm(forms.ModelForm):

  code = forms.CharField(label=&#39;源码&#39;, widget=AceWidget(attrs={&#39;cols&#39;: &#39;100&#39;, &#39;rows&#39;: &#39;20&#39;}, mode="python", theme="monokai"))

 

  class Meta:

    model = Code

    fields = [&#39;title&#39;, &#39;code&#39;]

Copier après la connexion

Il est à noter que le mode="python", theme="monokai" utilisé ici correspond aux fichiers mode-python.js et theme-monokai.js doivent être dans le répertoire /static/js/ace .

Rendu

Annexe :

models.py:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

#coding:utf-8

from django.db import models

 

 

class Code(models.Model):

  title = models.CharField(&#39;标题&#39;, max_length=50, unique=True)

  code = models.TextField(&#39;源码&#39;)

 

  class Meta:

    db_table = &#39;code&#39;

    verbose_name = verbose_name_plural = &#39;代码&#39;

 

  def __unicode__(self):

    return self.title

Copier après la connexion

admin.py:

1

2

3

4

5

6

7

8

9

10

from django.contrib import admin

from .models import Code

from .forms import CodeForm

 

 

class CodeAdmin(admin.ModelAdmin):

  form = CodeForm

  list_display = [&#39;id&#39;, &#39;title&#39;]

 

admin.site.register(Code, CodeAdmin)

Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal