在Form中初始化ModelChoiceField

时间:2016-02-01 00:15:28

标签: python django forms initialization

我的form.py

class BannerForm(forms.ModelForm):
    name = forms.CharField(max_length=32)
    affiliation = forms.ModelChoiceField(Affiliation.objects.all(), disabled = True, initial='Red')

我的model.py

class Affiliation (models.Model):
    name = models.CharField(max_length=32, unique=True)
    def __str__(self):
        return self.name

class Banner(models.Model):
    name = models.CharField(max_length=32, unique=True)
    affiliation = models.ForeignKey(Affiliation)

我的populate脚本(在开始填充数据库时运行)

def populate():
    red = add_affiliation('Red')
    black = add_affiliation('Black')

当我填写表格来创建横幅时,它不起作用,它没有看到红色(红色)像一个有效的选择:

<ul class="errorlist"><li>affiliation<ul class="errorlist"><li>Select a valid choice. That choice is not one of the available choices.</li></ul></li></ul>

我改变了form.py

class BannerForm(forms.ModelForm):
        name = forms.CharField(max_length=32)
affiliation = forms.ModelChoiceField(Affiliation.objects.all(), disabled = True, initial=Affiliation.objects.get(id=1))

并给出同样的错误。我又换了一次:

class BannerForm(forms.ModelForm):
        name = forms.CharField(max_length=32)
        affiliation = forms.ModelChoiceField(Affiliation.objects.all(), widget=forms.HiddenInput(), initial=Affiliation.objects.get(id=1))

它可以工作,但只有在我已经存在数据库时才更改代码,因为如果不是我的第一次迁移就会出错:

django.db.utils.OperationalError: no such table: core_affiliation

我该如何解决?我宁愿不使用HiddenInput,也不要硬编码id,如果可能的话。

谢谢

1 个答案:

答案 0 :(得分:0)

我已经解决了。 禁用字段不能用于传递数据,所以我添加一个字段来显示数据,另一个(隐藏)实际传递数据。

form.py

class BannerForm(forms.ModelForm):
    name = forms.CharField(max_length=32)
    Affiliazione = forms.CharField(disabled = True, required=False)
    affiliation = forms.ModelChoiceField(Affiliation.objects.all(),
    widget=forms.HiddenInput())

我按views

初始化它们
def add_banner(request):
    if request.method == 'POST':
        #some code
    else:
        options = Options.objects.get(id=1)
        form = BannerForm(request.POST or None, initial={
            'Affiliazione': options.new_affiliation,
            'affiliation': options.new_affiliation})
    return render(request, 'core/add_banner.html', {'form': form})

我创建Options模型以包含初始变量,如果变量在views.py上,则迁移工作正常...