使用查询中的对象填充选择字段

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 中):

希望对您有所帮助。干杯。 ;)