Django - 不使用表单或模型表单时在模板中呈现模型选择
Posted
技术标签:
【中文标题】Django - 不使用表单或模型表单时在模板中呈现模型选择【英文标题】:Django - Rendering Model Choices in template when not using Forms or ModelForms 【发布时间】:2018-07-14 10:37:27 【问题描述】:我创建了一个模型,其中一个字段有选择。我在模板中创建了一个选择表单,但未显示选择。出于几个原因,我没有使用 Forms 或 ModelForms。但我的理解是,我应该能够在模型中使用 CHOICES 来完成这项工作,在模板中构建一个表单并使用对象管理器保存信息。如何获得填充表单的选项?
模型.py
class NewRating(models.Model):
EXCELLENT = 'EX'
GOOD = 'GD'
FAIR = 'FR'
BAD = 'BD'
RATING_CHOICES = (
(EXCELLENT, 'Excellent'),
(GOOD, 'Good'),
(FAIR, 'Fair'),
(BAD, 'Bad')
)
function = models.ForeignKey(Function, related_name='frating')
timeline = models.ForeignKey(Timeline, related_name='trating')
rating = models.CharField(max_length=25,choices=RATING_CHOICES)
Views.py
def f_page(request, Function_id):
assignments = Function.objects.get(id=Function_id)
time = Timeline.objects.all()
ratings = NewRating.objects.all()
context =
'assignments': assignments,
'time' : time,
'ratings' : ratings,
return render (request, 'project/pager.html', context)
HTML
<div id=for_rat>
% for rated in time %
<form action= "/project/rated" method='POST'>
% csrf_token %
rated.segment
<input type="hidden" name="year" value="rated.year">
<input type="hidden" name="month" value= "assignments.id">
<select name="ratings">
<option value="">Choose From List</option>
% for rating in ratings %
<option value="rating.choices">rating.choices</option>
% endfor %
</select>
% endfor %
<input type="submit" value="Save">
</form>
</div>
使用 % for rating in rating % 评分.选择 % endfor % 不工作。如果我正在构建自己的表单,我可以在模型中设置选项吗?如果是,我做错了什么,这不是渲染?
【问题讨论】:
choices
不是您的 NewRating
模型的属性。你应该在你的模板中显示 rating.rating
它没有用。向下滚动中没有选择。
你让事情变得比他们需要的更难。没有什么理由不使用表单。
【参考方案1】:
如果您完全不愿意使用Form
或ModelForm
,则需要选择可迭代,这可以通过enum
实现。
您可以查看我的示例代码,了解如何使用枚举实现选择 here。
完成此操作后,您必须对上下文和模板进行一些调整。 你可能想看看how to get the list of choices with enum。
【讨论】:
【参考方案2】:最简单、最简单且百分百有效的方法是:
使用my_Model_with_choices = yourModel.objects.first()
获取对象[lets say 'my_Model_with_choices']
,您可以使用my_Model_with_choices._meta.get_field('your_foreign_key_variable_name').choices
获取选项
def f_page(request, Function_id):
assignments = Function.objects.get(id=Function_id)
ratings = NewRating.RATING_CHOICES
context =
'ratings' : ratings,
return render (request, 'project/pager.html', context)
HTML 模板内部:
<select class="custom-select col-md-5" name="ratings" id="ratings" required>
<option disabled selected value="">Ethnic Group</option>
% for value, ratings_group in ratings %
<option value='value'>ratings_group</option>
% endfor %
</select>
【讨论】:
【参考方案3】:试试这个
% for rating in ratings %
<select name="ratings">
<option value="">Choose From List</option>
% for x, y in rating._meta.get_field('rating').choices %
<option value=" x ">% if rating.rating == x % selected% endif %>
y
</option>
% endfor %
</select>
% endfor %
确保这段代码在外面
% for rated in time %
...
% endfor %
阻止
【讨论】:
以上是关于Django - 不使用表单或模型表单时在模板中呈现模型选择的主要内容,如果未能解决你的问题,请参考以下文章
使用 CBV 在 Django 中的一个视图/模板中的两个模型表单
Django:如何在 ajax 中返回模型表单集并在模板中使用
我们可以格式化模型表单如何在模板上的 Django 中显示吗