【发布时间】:2021-02-01 14:04:53
【问题描述】:
我正在构建一个简单的 Django 应用程序,让用户可以跟踪特定日期的内容:
它使用大写形式记录带有名称和日期的条目。
<form action="" method="post" style="margin-bottom: 1cm;">
{% csrf_token %}
<div class="form-group">
{{ form.entry_name.label_tag }}
<div class="input-group">
<input type="text" class="form-control" id="{{ form.entry_name.id_for_label }}" name="{{ form.entry_name.html_name }}" aria-label="new entry field">
{{ form.entry_date }}
<div class="input-group-append">
<button type="submit" class="btn btn-primary">Add</button>
</div>
</div>
<small id="{{ form.entry_name.id_for_label }}Help" class="form-text text-muted">This can be anything you want to track: An activity, food, how you slept, stress level, etc.</small>
</div>
</form>
表单下方有快速添加按钮,可让用户快速添加具有特定名称的新条目。另外,我想使用上面表格中选择的日期。即,如果用户在上方表单中设置了日期,但随后单击了建议的按钮之一,它仍应使用选定的日期来添加新条目。
这是建议按钮的代码当前的样子:
{% if entry_counts and entry_dict|length > 0 %}
<div class="card" style="margin-bottom: 1cm;">
<div class="card-body">
<div class="card-title">Suggested entries</div>
{% for name, count in entry_counts.items %}
<form method="post" action="{% url 'app:add_entry_with_date' name form.entry_date.value %}" style="display: inline-block;">
{% csrf_token %}
<button type="submit" class="btn btn-secondary" name="{{ name }}" style="margin-bottom: 5px;">{{ name }}</button>
</form>
{% endfor %}
</div>
</div>
{% endif %}
我正在尝试访问所选日期并将其传递给相应的视图:action="{% url 'app:add_entry_with_date' name form.entry_date.value %}",但它仍然在默认日期(今天)而不是在所选日期添加条目。
我的猜测是,问题出在<button type="submit" class="btn btn-secondary" name="{{ name }}" style="margin-bottom: 5px;">{{ name }}</button> 上。这只是通过name而不是提交时的日期吗?
以下是相关的 URL 模式:
class DateConverter:
regex = '\d{4}-\d{2}-\d{2}'
def to_python(self, value):
return datetime.datetime.strptime(value, '%Y-%m-%d')
def to_url(self, value):
return value
register_converter(DateConverter, 'yyyymmdd')
urlpatterns = [
path('', views.index, name='index'),
path('add/<entry_name>/', views.add_entry, name='add'),
path('add/<entry_name>/<yyyymmdd:entry_date>/', views.add_entry, name='add_entry_with_date'),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
因此,无论何时添加新条目(有或没有特定日期),都会调用我的 add_entry 视图:
@login_required
def add_entry(request, entry_name, entry_date=datetime.date.today()):
# only works for post
# if request.method == 'POST':
entry_name = entry_name.strip().lower()
entry = Entry.objects.create(name=entry_name, date=entry_date, owner=request.user)
return HttpResponseRedirect(reverse('app:index'))
【问题讨论】:
-
您正试图通过 URL 传递日期值,对吗? “这只是传递名称而不是提交时的日期吗?”似乎与问题无关。据我所知,提交按钮不应该用于传递数据,并且您在该表单中没有任何
input元素。无论如何,我有一种预感,问题出在您的视图中,而不是您的 HTML 中,因此如果您分享add_entry_with_date的详细信息可能会有所帮助。 -
我没有输入元素,因为我希望用户能够只单击一个按钮而无需填写文本字段和日期字段。或者我可以在设置值的地方做一些不可见的输入吗?此外,通过按钮传递条目名称是可行的。我刚刚更新了描述以添加我的 URL 并按照您的建议进行查看。是的,我正在尝试通过快速添加按钮的 URL 传递日期。我用邮递员测试了 URL,它应该可以工作。
-
您绝对可以进行隐形输入:只需使用
type="hidden"。事实上,Django 是这样渲染csrf_token的。无论如何,我发布了一个答案,如果有帮助,请告诉我。
标签: python html django forms django-templates