在CreateView的Django模板中显示foriegnkey字段
我正在尝试使用ForeignKey字段中的值在CreateView中显示一个清单以进行说明 models.py在CreateView的Django模板中显示foriegnkey字段,django,python-3.x,foreign-keys,django-class-based-views,Django,Python 3.x,Foreign Keys,Django Class Based Views,我正在尝试使用ForeignKey字段中的值在CreateView中显示一个清单以进行说明 models.py class Structure(models.Model): name = models.CharField(max_length = 30) description =models.CharField(max_length = 300, null=True, blank=True) def __str__(self): return self.
class Structure(models.Model):
name = models.CharField(max_length = 30)
description =models.CharField(max_length = 300, null=True, blank=True)
def __str__(self):
return self.name
class SelectedFramework(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
structure = models.ForegignKey(Structure)
selected = models.BooleanField(default = False)
views.py
class FrameworkCreateView(generic.CreateView):
model = SelectedFramework
fields =['structure', 'selected']
template_name = 'catalogue/structure.html'
def form_valid(self, form):
form.instance.user = self.request.user
return super(FrameworkCreateView, self).form_valid(form)
structure.html
{% extends 'catalogue\base.html' %}
{% block container %}
<h2>{% block title %}Structures{% endblock title %}</h2>
<form action="" method="post">
{% csrf_token %}
{% for field in form %}
<div class="col-sm-10">{{form.structure}} {{form.selected}}</div><br>
{% endfor %}
</div>
</form>
{% endblock %}
{%extends'catalog\base.html%}
{%block container%}
{%block title%}结构{%endblock title%}
{%csrf_令牌%}
{%形式的字段为%}
{{form.structure}{{form.selected}}
{%endfor%}
{%endblock%}
上面的代码可以工作,但会将ForeignKey“structure”显示为一个下拉列表,其值为\uuu str\uu
。是否有办法在CreateView中选中中的复选框来显示结构.name
和结构.description
的字符串 在模板中使用:
{{ form.structure.name }}
{{ form.structure.description}}
如果希望通过在模板中迭代来获取字段。你必须使用-
{% for field in form %}
{{ field }}
{% endfor %}
不必使用任何点符号来获取字段。如果要获取字段的标签,可以使用{{field.label}
通常在{{field}
之前使用{field.label}
,您可以编写自定义表单,覆盖保存方法,并在此处手动创建结构
对象:
class FrameworkForm(forms.ModelForm):
structure_name = forms.CharField(required=True)
structure_description = forms.CharField(required=False)
class Meta:
model = SelectedFramework
fields = [
'structure_name', 'structure_description', 'selected'
]
def save(self, commit=False):
instance = super(FrameworkForm, self).save(commit=False)
structure = Structure(
name=self.cleaned_data.get('structure_name'),
description=self.cleaned_data.get('structure_description')
)
structure.save()
instance.structure = structure
instance.save()
return instance
同时将form\u class=FrameworkForm
添加到视图中,而不是fields=['structure','selected']
编辑:
也许你想要这样的东西:
<ul>
{% for structure in form.fields.structure.choices.queryset %}
<li>{{ structure.name }} - {{ structure.description }}</li>
{% endfor %}
</ul>
{%用于form.fields.structure.choices.queryset%中的结构}
- {{structure.name}-{{structure.description}
{%endfor%}
我已经尝试了这两种方法,并使用双下划线引用了foreignkey,但它所做的只是将字段改为allblank@Baishakhi_Dasgupta这只会给我一个带有一个复选框的下拉列表,而不是只生成两个字符域的带有多个复选框的列表。我正在尝试显示外键值,因此Django不允许在CreateView
中同时使用form\u class
和字段
,您可以使用其中一个,但不能同时使用另一个。我知道Django不允许同时使用这两个。我写道,您可以添加form\u class
而不是字段
。我编辑了我的答案,它可能对你有用。没有在for循环中工作所有内容都是空白的,不知道为什么。我试着用下划线来代替点,但还是一无所获。