forms组件03 formset批量添加

数据库:

class Menu(models.Model):
    title = models.CharField(verbose_name='一级菜单名称', max_length=32)
    icon = models.CharField(verbose_name='图标', max_length=32)

    def __str__(self):
        return self.title


class Permission(models.Model):
    """
    权限表
    """
    title = models.CharField(verbose_name='标题', max_length=32)
    url = models.CharField(verbose_name='含正则的URL', max_length=128)
    menu = models.ForeignKey(verbose_name='所属菜单', null=True, blank=True, to='Menu', on_delete=models.CASCADE)
    pid = models.ForeignKey(verbose_name="关联的权限",to='Permission',null=True,blank=True,related_name='parents',on_delete=models.CASCADE)
    name = models.CharField(verbose_name="url别名",max_length=32,unique=True)
    def __str__(self):
        return self.title

forms(ChoiceField的使用):

from django import forms
from app01.models import *
class MultiPermissionForm(forms.Form):
    title = forms.CharField(
        widget=forms.TextInput(attrs={'class':'form-control'})
    )
    url = forms.CharField(
        widget=forms.TextInput(attrs={'class': 'form-control'})
    )

    name = forms.CharField(
        widget=forms.TextInput(attrs={'class':'form-control'})
    )
    menu_id = forms.ChoiceField( #########choices = [(xxx,xxx),(xxx,xxx)] 下拉框每个选项 key value
        choices=[(None,'------------')],
        widget=forms.Select(attrs={'class': 'form-control'}),
        required = False
    )
    pid_id = forms.ChoiceField(         #######choices = [(xxx,xxx),(xxx,xxx)] 下拉框每个选项 key value
        choices=[(None, '-----------')],
        widget=forms.Select(attrs={'class': 'form-control'}),
        required=False
    )
    def __init__(self,*args,**kwargs): ####给下拉框加选项  (数据库)
        super().__init__(*args,**kwargs)
        self.fields['menu_id'].choices += Menu.objects.values_list('id','title')
        self.fields['pid_id'].choices += Permission.objects.filter(pid__isnull=True).exclude(
            menu__isnull = True
        ).values_list('id','title')

views(form_set的使用):

from django.shortcuts import render
from app01.myforms.customform import MultiPermissionForm 
from django.forms import formset_factory  ########引入模块########
# Create your views here.

def multi_add(request):
    form_class = formset_factory(MultiPermissionForm,extra=5) #######用哪个form  生成几个form
   formset= form_class()
return render(request,'multi_add.html',locals())

templates:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
<div class="container">
<div class="col-md-4 col-md-offset-3">
<form>
{% for form in formset %}
    <hr>
    {% for field in form %}
        {{ field.label }}
        {{  field }}
        {% endfor %}
    {% endfor %}
</form>
</div>
</div>
</body>
</html>

  5个

放到表格提交数据:

  -templagets:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css"
integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
<div class="container">
<div class="col-md-offset-2">
<form method="post">
{% csrf_token %}
<table>
<thead>
<tr>
<td>title</td>
<td>url</td>
<td>name</td>
<td>menu_id</td>
<td>pid_id</td>
</tr>
</thead>
<tbody>
{% for form in formset%}
<tr>
{% for field in form %}
<td>{{ field }}</td>
{% endfor %}
</tr>
{% endfor %}
</tbody>
</table>
<input type="submit" value="提交">
</form>
</div>
</div>
</body>
</htm>

 

  - views:

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

                                               

猜你喜欢

转载自www.cnblogs.com/Jnhnsnow/p/11682109.html