Django选择字段默认值和readonly

时间:2017-02-01 11:34:13

标签: django

我尝试以readonly的形式设置我的字段并输入任何默认值。 这是我表格的一部分:

category = forms.CharField(widget=forms.TextInput(attrs={'readonly':
                                                             'readonly'}),
                               initial=Category.objects.get(name='Zdrowie i uroda'))

class Meta:
    model = Site
    fields = ('url', 'name', 'description', 'keywords', 'group', 'category',
              'subcategory', 'category1', 'subcategory1')

我收到错误:无法指定"' Zdrowie i uroda'":" Site.category"必须是"类别"实例

这是我的网站型号:

class Site(models.Model):
    category = models.ForeignKey('Category')
    subcategory = ChainedForeignKey(
        'SubCategory',
        chained_field='category',
        chained_model_field='category',
        show_all=False,
        auto_choose=True)
    name = models.CharField(max_length=70)
    description = models.TextField()
    # importuje zmienione TextFields widgets.py
    keywords = MyTextField()
    date = models.DateTimeField(default=datetime.now, editable=False)
    url = models.URLField()
    is_active = models.BooleanField(default=False)

    category1 = models.ForeignKey('Category', related_name='category', blank=True, null=True, default=None)
    subcategory1 = ChainedForeignKey(
        'SubCategory',
        chained_field='category1',
        chained_model_field='category',
        related_name='subcategory',
        show_all=False,
        auto_choose=True, blank=True, null=True, default=None)

    group = models.CharField(max_length=10, choices=(('podstawowy', 'podstawowy'),
                                                     ('premium', 'premium')), default='podstawowy')

    def get_absolute_url(self):
        return reverse('site', args=[str(self.category.slug),
                                     str(self.subcategory.slug), str(self.id)])

    def get_thumb(self):
        host = urlparse(self.url).hostname
        if host.startswith('www.'):
            host = host[4:]
        thumb = 'http://free4.pagepeeker.com/v2/thumbs.php?size=s&url=' + host
        return thumb

    class Meta:
        verbose_name_plural = "Strony"

    def __str__(self):
        return self.name

我无法处理它。有线索吗?

最后,我从我的model.form中排除了category,subcategory字段,并将其手动添加到html源代码中:

{{ form_extended|bootstrap }}
                    <label for="example-text-input" class="col-2 col-form-label">Category</label>
                    <input class="form-control form-control-lg" type="text" name="category" disabled required value="{{ form_extended.initial.category.name }} " />
                    <label for="example-text-input" class="col-2 col-form-label">Subcategory</label>
                    <input class="form-control form-control-lg" type="text" name="subcategory" disabled required value="{{ form_extended.initial.subcategory.name }} " />

我不认为这是正确的方法,但我无法将一些数据用于形成初始值。我应该从头开始手动创建表单吗?我的方式并不好,因为我使用jQuery来扩展表单。现在类别,子类别字段是las,但它们不应该(当用户选择&#34; premium&#34;来自选择字段的组时,在子类别字段之后应该出现&#34; category1&#34;,&#34; subcategory1&#34; fields ...

一如既往 - 我为可怕的英语感到抱歉。每个帖子都像我的考试一样。

1 个答案:

答案 0 :(得分:1)

选项无需进一步深入研究Django表单:

更改模型字段

这可能不是一个选项,但您可以尝试设置:

--user

从表单中删除类别表单字段的显式声明,只需在初始化表单时设置初始类别,或覆盖class Site(models.Model): category = models.ForeignKey('Category', editable=False) 进行设置。

更改表单字段

Django通常会将ForeignKeyField呈现为下拉列表。你明确想要一个文本输入吗?在这种情况下,您必须自己处理数据验证和数据映射。

解决这个问题的方法是删除表单字段的显式声明,并在HTML模板中单独处理该字段:

__init__
  

“你明确想要输入文字吗?” - 不。

在这种情况下,您需要here而不是<input type="text" name="category" value="{{ form.initial.category.name }}" />

CharField