下面是自定义Django Form中choicefield下拉菜单选取数据库内容的完整攻略。
1. 给ChoiceField填充数据
1.1 在forms.py中定义ChoiceField
首先,我们需要在Django表单的forms.py文件中定义一个ChoiceField,它将用于展示下拉菜单。
from django import forms
from .models import MyModel # 导入自定义的模型
class MyForm(forms.Form):
my_choice_field = forms.ChoiceField(choices=[]) # 创建一个空的ChoiceField
1.2 获取数据库中的数据,并将其加入choices中
接下来,我们需要从数据库中获取数据,并将它们添加到ChoiceField的choices中。我们可以在视图函数中完成这个步骤,并将带有查询结果的表单发送到用户。
from django.shortcuts import render
from .forms import MyForm
from .models import MyModel
def my_view(request):
form = MyForm()
my_model_objects = MyModel.objects.all() # 获取MyModel模型的所有对象
choices = [(obj.id, obj.name) for obj in my_model_objects] # 将模型对象转换为choice元组(id,名称)
form.fields['my_choice_field'].choices = choices # 将choice元组添加到ChoiceField的choices中
return render(request, 'my_template.html', {'form': form})
2. 在模板中展示ChoiceField
下一步是在HTML模板中展示ChoiceField。我们使用Django表单的默认标记语言(如{{ form.my_choice_field }}),从而生成下拉菜单。
{% extends 'base.html' %}
{% block content %}
<form method="POST">
{% csrf_token %}
{{ form.my_choice_field }}
<button type="submit">提交</button>
</form>
{% endblock %}
示例1:查看所有标签
假设我们有一个博客网站,其中的帖子可以附有多个标签。现在我们想在下拉菜单中列出所有标签,以便用户添加标签。我们可以这样做。
# models.py
from django.db import models
class Tag(models.Model):
name = models.CharField(max_length=255)
def __str__(self):
return self.name
class Post(models.Model):
title = models.CharField(max_length=255)
body = models.TextField()
tags = models.ManyToManyField(Tag)
def __str__(self):
return self.title
# forms.py
class TagForm(forms.Form):
tag = forms.ChoiceField(choices=[]) # 创建一个空的ChoiceField
# views.py
def tag_create_view(request):
form = TagForm()
tags = Tag.objects.all()
choices = [(tag.id, tag.name) for tag in tags]
form.fields['tag'].choices = choices
return render(request, 'tag_create.html', {'form': form})
# tag_create.html
{% extends 'base.html' %}
{% block content %}
<form method="POST">
{% csrf_token %}
{{ form.tag }}
<button type="submit">提交</button>
</form>
{% endblock %}
示例2:查看所有订单
现在假设我们有一个电商网站,其中的用户可以在下拉菜单中选择他们之前的订单,以查看它们的状态。我们可以按照以下步骤操作。
# models.py
from django.db import models
from django.contrib.auth.models import User
class Order(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
status = models.CharField(max_length=255, choices=(
('created', '已创建'),
('confirmed', '已确认'),
('shipped', '已发货'),
('delivered', '已送达'),
('canceled', '已取消'),
))
def __str__(self):
return f"Order #{self.id} ({self.status})"
# forms.py
class OrderForm(forms.Form):
order = forms.ChoiceField(choices=[]) # 创建一个空的ChoiceField
# views.py
def order_status_view(request):
form = OrderForm()
orders = Order.objects.filter(user=request.user) # 获取该用户的所有订单
choices = [(order.id, str(order)) for order in orders] # 将订单转换为choice元组
form.fields['order'].choices = choices # 更新订单下拉菜单的choice选项
return render(request, 'order_status.html', {'form': form})
# order_status.html
{% extends 'base.html' %}
{% block content %}
<form method="POST">
{% csrf_token %}
{{ form.order }}
<button type="submit">提交</button>
</form>
{% endblock %}
这样就完成了我们自定义Django Form中choicefield下拉菜单选取数据库内容的过程。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:自定义Django Form中choicefield下拉菜单选取数据库内容实例 - Python技术站