问题1:Python Imports代码布局规则有哪些?
ANS:
1、import 语句应放在文件头部,置于模块说明及docstring之后
2、import 语句应分行书写
3、import 语句须按以下顺序分组书写,书写时,每组间加入一个空行。
- python内置模块
- 第三方模块
- 自己定义的模块
同时,第一组内部按照字母顺序排列。
问题2:Django针对不同的formset提供了哪3种方法?分别如何使用。
Django针对不同的formset提供了3种方法: formset_factory, modelformset_factory和inlineformset_factory。我们接下来分别看下如何使用它们。
1、如何使用formset_factory
对于继承forms.Form的自定义表单,我们可以使用formset_factory。我们可以通过设置extra和max_num属性来确定我们想要展示的表单数量。
from django import forms
class BookForm(forms.Form):
name = forms.CharField(max_length=100)
title = forms.CharField()
pub_date = forms.DateField(required=False)
# forms.py - build a formset of books
from django.forms import formset_factory
from .forms import BookForm
# extra: 想要显示空表单的数量
# max_num: 表单显示最大数量,可选,默认1000
BookFormSet = formset_factory(BookForm, extra=3, max_num=2)
在视图文件views.py里,我们可以像使用form一样使用formset。
# views.py - formsets example.
from .forms import BookFormSet
from django.shortcuts import render
def manage_books(request):
if request.method == 'POST':
formset = BookFormSet(request.POST, request.FILES)
if formset.is_valid():
# do something with the formset.cleaned_data
pass
else:
formset = BookFormSet()
return render(request, 'manage_books.html', {'formset': formset})
模板里可以这样使用formset。
<form action=”.” method=”POST”>
{{ formset }}
</form>
也可以这样使用。
<form method="post">
{{ formset.management_form }}
<table>
{% for form in formset %}
{{ form }}
{% endfor %}
</table>
</form>
2、如何使用modelformset_factory
先创建自定义的ModelForm,添加单个表单验证,然后再利用modelformset_factory创建formset。
class AuthorForm(forms.ModelForm):
class Meta:
model = Author
fields = ('name', 'title')
def clean_name(self):
# custom validation for the name field
...
由ModelForm创建formset:
AuthorFormSet = modelformset_factory(Author, form=AuthorForm)
在模板和视图里使用formset的方法与前面的例子是一样的。
3、如何使用inlineformset_factory
试想我们有如下recipe模型,Recipe与Ingredient是单对多的关系。一般的formset只允许我们一次性提交多个Recipe或多个Ingredient。但如果我们希望同一个页面上添加一个菜谱(Recipe)和多个原料(Ingredient),这时我们就需要用使用inlineformset了。
from django.db import models
class Recipe(models.Model):
title = models.CharField(max_length=255)
description = models.TextField()
class Ingredient(models.Model):
recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE, related_name='ingredient')
name = models.CharField(max_length=255)
利用inlineformset_factory创建formset的方法如下所示。该方法的第一个参数和第二个参数都是模型,其中第一个参数必需是ForeignKey。
# forms.py
from django.forms import ModelForm
from django.forms import inlineformset_factory
from .models import Recipe, Ingredient, Instruction
class RecipeForm(ModelForm):
class Meta:
model = Recipe
fields = ("title", "description",)
IngredientFormSet = inlineformset_factory(Recipe, Ingredient, fields=('name',),
extra=3, can_delete=False, max_num=5)
views.py中使用formset创建和更新recipe的代码如下。在对IngredientFormSet进行实例化的时候,必需指定recipe的实例。
def recipe_update(request, pk):
recipe = get_object_or_404(Recipe, pk=pk)
if request.method == "POST":
form = RecipeForm(request.POST, instance=recipe)
if form.is_valid():
recipe = form.save()
ingredient_formset = IngredientFormSet(request.POST, instance=recipe)
if ingredient_formset.is_valid():
ingredient_formset.save()
return redirect('/recipe/')
else:
form = RecipeForm(instance=recipe)
ingredient_formset = IngredientFormSet(instance=recipe)
return render(request, 'recipe/recipe_update.html', {'form': form,
'ingredient_formset': ingredient_formset,
})
def recipe_add(request):
if request.method == "POST":
form = RecipeForm(request.POST)
if form.is_valid():
recipe = form.save()
ingredient_formset = IngredientFormSet(request.POST, instance=recipe)
if ingredient_formset.is_valid():
ingredient_formset.save()
return redirect('/recipe/')
else:
form = RecipeForm()
ingredient_formset = IngredientFormSet()
return render(request, 'recipe/recipe_add.html', {'form': form,
'ingredient_formset': ingredient_formset,
})
模板recipe/recipe_add.html代码如下。
<h1>Add Recipe</h1>
<form action="." method="post">
{% csrf_token %}
{{ form.as_p }}
<fieldset>
<legend>Recipe Ingredient</legend>
{{ ingredient_formset.management_form }}
{{ ingredient_formset.non_form_errors }}
{% for form in ingredient_formset %}
{{ form.name.errors }}
{{ form.name.label_tag }}
{{ form.name }}
</div>
{% endfor %}
</fieldset>
<input type="submit" value="Add recipe" class="submit" />
</form>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?