使用查询中的对象填充选择字段
Filling a choice field with objects from a query
我有一个 ModelForm,我想在其中添加一个 dynamic select。
我在 forms.py 中的模型:
class AuxiForm(forms.ModelForm):
class Meta:
model = Auxi
fields = ["tipAux"]
widgets = {
'tipAux': forms.Select(attrs={'class': 'form-control', 'placeholder': 'Tipo'}),
}
labels = {
'tipAux': 'Tipo',
}
我想要一个 choicefield,它应该是动态的,通过来自另一个名为 TipoAux 的 class 的查询填充自身。
models.py 中的 TipoAux:
class TipoAux(models.Model):
denom = models.CharField(max_length=30, null=True)
def __str__(self): # Python 3
return self.denom
结论:我是我的表单我应该有一个 动态 select 从 TipoAux class
收集它的选项
像这样:
Options = (
(1, 'First option',
(2, 'Second option',
)
但是从我的数据库中获取它的选项,而不必手动添加它们。
要获得此结构,您应该遵循并执行以下步骤:
创建一个名为 TipoAux:
的模型
class TipoAux(models.Model):
denom = models.CharField(max_length=50)
def __str__(self):
return self.name
然后立即 运行 migrate 因为另一个 table 将依赖于此(如果您还没有此 table)。
然后像其他模型一样创建其他东西(这是您实际上最感兴趣的问题):
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')
然后是你的 Form(首先简单一点,还不要使用 select 小部件和标签,因为它是根据模型自动创建的):
from .models import Auxi
class AuxiForm(forms.ModelForm):
class Meta:
model = Auxi
fields = ["tipAux"]
然后你的视图是这样的:
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 table
然后您只需为 urls.py
中的视图创建一个 url path
并且不要忘记在 admin.py
.
中注册您的模型
from .models import TipoAux, Auxi
admin.site.register(TipoAux)
admin.site.register(Auxi)
然后您必须转到站点的管理页面并在 TipoAux table 中创建一些项目以获得一些选项值。
这是上面的视觉最终结果(将我的结果记录在 gif 中):
希望对您有所帮助。干杯。 ;)
我有一个 ModelForm,我想在其中添加一个 dynamic select。
我在 forms.py 中的模型:
class AuxiForm(forms.ModelForm):
class Meta:
model = Auxi
fields = ["tipAux"]
widgets = {
'tipAux': forms.Select(attrs={'class': 'form-control', 'placeholder': 'Tipo'}),
}
labels = {
'tipAux': 'Tipo',
}
我想要一个 choicefield,它应该是动态的,通过来自另一个名为 TipoAux 的 class 的查询填充自身。
models.py 中的 TipoAux:
class TipoAux(models.Model):
denom = models.CharField(max_length=30, null=True)
def __str__(self): # Python 3
return self.denom
结论:我是我的表单我应该有一个 动态 select 从 TipoAux class
收集它的选项像这样:
Options = (
(1, 'First option',
(2, 'Second option',
)
但是从我的数据库中获取它的选项,而不必手动添加它们。
要获得此结构,您应该遵循并执行以下步骤:
创建一个名为 TipoAux:
的模型class TipoAux(models.Model):
denom = models.CharField(max_length=50)
def __str__(self):
return self.name
然后立即 运行 migrate 因为另一个 table 将依赖于此(如果您还没有此 table)。
然后像其他模型一样创建其他东西(这是您实际上最感兴趣的问题):
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')
然后是你的 Form(首先简单一点,还不要使用 select 小部件和标签,因为它是根据模型自动创建的):
from .models import Auxi
class AuxiForm(forms.ModelForm):
class Meta:
model = Auxi
fields = ["tipAux"]
然后你的视图是这样的:
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 table
然后您只需为 urls.py
中的视图创建一个 url path
并且不要忘记在 admin.py
.
from .models import TipoAux, Auxi
admin.site.register(TipoAux)
admin.site.register(Auxi)
然后您必须转到站点的管理页面并在 TipoAux table 中创建一些项目以获得一些选项值。
这是上面的视觉最终结果(将我的结果记录在 gif 中):
希望对您有所帮助。干杯。 ;)