django 表單
實(shí)現(xiàn)方式一:將具體的search操作放到views
首先,在app下面新建一個(gè)forms.py文件,用于定義表單。創(chuàng)建了一個(gè)名為"SearchCaseForm"的表單,并定義了一個(gè)名為“case_name”的CharField
from django import forms
class SearchCaseForm(forms.Form):
case_name = forms.CharField()
創(chuàng)建一個(gè)搜索視圖,它將處理從搜索表單的查詢字符串并返回匹配的對(duì)象。在應(yīng)用程序中創(chuàng)建一個(gè)名為“views.py”的新文件,并將以下代碼添加到文件中
from django.shortcuts import render
from .models import Post
from .forms import SearchForm
def search(request):
form = SearchForm(request.GET or None)
results = []
if request.method == 'GET' and form.is_valid():
case_name = form.cleaned_data['case_name']
results = Post.objects.filter(title__icontns=case_name)
return render(request, 'search.html', {'form': form, ‘results’: results})
創(chuàng)建搜索模版,需要?jiǎng)?chuàng)建一個(gè)名為“search.html”的模板,它將呈現(xiàn)搜索表單和搜索結(jié)果
{% csrf_token %}
{{ form.as_p }}
Search
{% if results %}
Results
{% for result in results %}
{{ result.title }}
{% endfor %}
{% endif %}
實(shí)現(xiàn)方式二:將具體的search操作放到forms中
forms.py
class SearchCaseForm(forms.Form):
cluster_type = forms.ModelChoiceField(queryset=models.ClusterType.objects.all(),
widget=forms.Select(attrs={'class': 'custom-select mb-3'}), required=False)
cluster_version = forms.ModelChoiceField(queryset=models.Version.objects.all(),
widget=forms.Select(attrs={'class': 'custom-select mb-3'}), required=False)
cluster_repo = forms.ModelChoiceField(queryset=models.Repo.objects.all(),
widget=forms.Select(attrs={'class': 'custom-select mb-3'}), required=False)
def search(self):
cluster_type = self.cleaned_data["cluster_type"]
cluster_repo = self.cleaned_data["cluster_repo"]
cluster_version = self.cleaned_data["cluster_version"]
logger.info(self.cleaned_data["cluster_version"])
all_scenio = models.ScenioCase.objects.all()
# xxx
return all_scenio
views.py
def get(self, request):
form_search_case = forms.SearchCaseForm(request.GET)
all_scenio = form_search_case.search() if form_search_case.is_valid() else models.ScenioCase.objects.all()
return render(request, 'search.html', {'form': form_search_case, 'results': all_scenio})
其他小細(xì)節(jié)
1)如何取消表單required
使用required=false
cluster_repo = forms.ModelChoiceField(queryset=models.Repo.objects.all(),
widget=forms.Select(attrs={'class': 'custom-select mb-3'}), required=False)
2)下拉框元素
可以直接使用表中數(shù)據(jù),也可以自定義元素的可選值
https://cloud.tencent.com/developer/information/如何在django中為表單創(chuàng)建下拉框?-album
from django import forms
class MyForm(forms.Form):
my_choices = (
('option1', 'Option 1'),
('option2', 'Option 2'),
('option3', 'Option 3'),
)
my_field = forms.ChoiceField(choices=my_choices)
from django import forms
from .models import MyModel
class MyForm(forms.Form):
my_field = forms.ModelChoiceField(queryset=MyModel.objects.all())
3)如何對(duì)is_valid做自定義校驗(yàn)
https://c.biancheng.net/view/7973.html
表單系統(tǒng)會(huì)自動(dòng)查找以 clean_ 開頭,以字段名結(jié)尾的方法,它會(huì)在驗(yàn)證字段合法性的過程中被調(diào)用,因此,如果想要自定義校驗(yàn)邏輯,可以按如下方式編寫代碼:
class RegForm(forms.Form):
name = forms.CharField(label='用戶名')
def clean_name(self):
name=self.cleaned_data['name']
if len(name)<6:
raise forms.ValidationError("你注冊(cè)的用戶名字符太短了")
return name
4) 模版:為了豐富表單的格式,可以進(jìn)行以下幾種方式
https://geek-docs.com/django/django-questions/587_django_django_what_is_the_best_way_to_format_forms.html
比如在forms.py定義attrs,定義html的css格式
cluster_repo = forms.ModelChoiceField(queryset=models.Repo.objects.all(),
widget=forms.Select(attrs={'class': 'custom-select mb-3'}), required=False)
在templates文件中定義各個(gè)表單元素的格式
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-body">
<form method="get">
{% csrf_token %}
<div class="form-row" style="width: 800px">
<div class="col">
{{ form.cluster_type.label_tag }}{{ form.cluster_type }}
</div>
<div class="col">
{{ form.cluster_repo.label_tag }}{{ form.cluster_repo }}
</div>
<div class="col">
{{ form.cluster_version.label_tag }}{{ form.cluster_version }}
</div>
<div class="col">
<button style="margin-top: 30px" type="submit" class="btn btn-success">Search</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
效果圖

5)表單文本框增加提示
# forms.py
be_module_config = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control',
'placeholder': '該case要變更的be配置'}), required=False)
# html
{{ form.be_module_config.label_tag }} {{ form.be_module_config }}
效果如下:

6)multi字段
cluster_type = forms.ModelMultipleChoiceField(queryset=models.ClusterType.objects.all(), widget=forms.SelectMultiple(attrs={'class': 'form-control'}))
posted on 2024-05-06 16:33 Y.Debby 閱讀(31) 評(píng)論(0) 收藏 舉報(bào)

浙公網(wǎng)安備 33010602011771號(hào)