我有一个 ModelForm,我试图在其中进行动态选择。
forms.py 中的我的 ModelForm:
class AuxiForm(forms.ModelForm):
class Meta:
model = Auxi
fields = ["tipAux"]
widgets = {
'tipAux': forms.Select(attrs={'class': 'form-control', 'placeholder': 'Tipo'}),
}
labels = {
'tipAux': 'Tipo',
}
我想要一个选择字段,它应该是动态的,通过来自另一个名为TipoAux的类的查询来填充自己。
models.py 中的 TipoAux:
class TipoAux(models.Model):
denom = models.CharField(max_length=30, null=True)
def __str__(self): # Python 3
return self.denom
结论:我的表单应该有一个动态选择,它从 TipoAux 类收集其选项
像这样:
Options = (
(1, 'First option',
(2, 'Second option',
)
但是从我的数据库获取其选项,而不必手动添加它们。
最佳答案
要拥有此结构,您应该遵循并执行后续步骤:
创建一个名为TipoAux的模型:
class TipoAux(models.Model):
denom = models.CharField(max_length=50)
def __str__(self):
return self.name
然后立即运行迁移,因为另一个表将依赖于此(如果您还没有该表)。
然后创建其他东西,例如其他模型(这是您对问题实际上最感兴趣的东西):
class Auxi(models.Model):
# we get the TipoAux choice values from the TipoAux table and creating a list of that
all_tipoaux = TipoAux.objects.values()
TIPAUX_CHOICES = [(d['id'], d['denom']) for d in all_tipoaux]
tipAux = models.IntegerField(choices=TIPAUX_CHOICES, null=True, verbose_name='Tipo')
然后你的表单(首先让它变得简单,不要使用选择小部件和标签,因为它是根据模型自动创建的):
from .models import Auxi
class AuxiForm(forms.ModelForm):
class Meta:
model = Auxi
fields = ["tipAux"]
然后你的 View 是这样的:
from django.shortcuts import render, redirect
from django.http import HttpResponseRedirect, HttpResponse, HttpRequest
from django.urls import reverse
from .forms import AuxiForm
from .models import Auxi
def tipo(request):
if request.method == 'POST':
form = AuxiForm(request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect(reverse('myappname:index'))
else:
form = AuxiForm()
return render(request, 'myappname/auxiform.html', {'form': form})
你必须run migration
再次创建Auxi表
然后你只需创建一个 url path
到 urls.py
中的 View 并且不要忘记在 admin.py
中注册您的型号.
from .models import TipoAux, Auxi
admin.site.register(TipoAux)
admin.site.register(Auxi)
然后,您必须转到站点的管理页面,并在 TipoAux 表中创建一些项目以获得一些选项值。
这是上面的视觉最终结果(将我的结果记录在gif中):
希望这对您有帮助。干杯。 ;)
关于python - 使用查询中的对象填充选择字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54470496/