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

标签 python django modelform

我有一个 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 pathurls.py 中的 View 并且不要忘记在 admin.py 中注册您的型号.

from .models import TipoAux, Auxi

admin.site.register(TipoAux)
admin.site.register(Auxi)

然后,您必须转到站点的管理页面,并在 TipoAux 表中创建一些项目以获得一些选项值。

这是上面的视觉最终结果(将我的结果记录在gif中):

enter image description here

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

关于python - 使用查询中的对象填充选择字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54470496/

相关文章:

python - 通过 cron (python -m) 将库模块作为脚本运行

Python Heads Or Tails 程序帮助

Django:重定向到一个页面,然后再次重定向回来?

django - DJANGO:更改ModelMultipleChoiceField的字段大小吗?

python - 通过与第二个列表比较从列表中删除项目,Python

python - Django 更改根 URL

database - Django 能否在每个单元测试之间刷新其数据库?

django - 查询新的 Django/Postgres DateRangeField

python - 图像字段模型形式的 Django 自定义验证(最大文件大小等)

Django 形成动态让作者作为模型表单中的登录用户