これは私のモデルです:
class dateEvent(models.Model):
venue = models.ForeignKey(Venue, on_delete=models.CASCADE)
event = models.ForeignKey('Event', on_delete=models.CASCADE)
start_date_time = models.DateTimeField(auto_now=False, auto_now_add=False)
私の views.py:
def event_edit_view(request, id):
event = get_object_or_404(Event, id=id)
#MyOtherForm instantiated by event
DateEventFormSet = inlineformset_factory(Event, dateEvent, extra=5, can_delete=True, fields=('event', 'start_date_time', 'venue', 'link', 'link_description'),
widgets={
'venue': s2forms.Select2Widget(),
'start_date_time': CalendarWidget(),
form_date_event = DateEventFormSet(request.POST or None, instance=Event.objects.get(id=id), prefix="dateEvent", queryset=dateEvent.objects.filter(event__id=id))
if request.method == "POST":
if MyOtherForm.is_valid() and form_date_event.is_valid():
MyOtherForm.save()
form_date_event.save()
return redirect('my-events')
else:
raise forms.ValidationError(form_date_event.errors) #?
context = {
[other forms...]
'form_date_event': form_date_event,
}
return render(request, "events/template.html", context)
そして私の template.html:
<table id="dateEvent">
<thead>
<th>Venue</th>
<th>Date and time</th>
<th>Link</th>
<th>Link description</th>
</thead>
<tbody id='date_body'>
{{ form_date_event.management_form }}
{% for formDate in form_date_event.forms %}
<tr class="form-row-dateEvent" style='display:table-row;'>
<td>{{formDate.venue}}<br>
<a href="javascript:void(0)" data-open="addVenue" onclick="sessionStorage.setItem('venueField', 'id_dateEvent-{{forloop.counter0}}-venue'); document.getElementById('addVenueForm').reset(); document.getElementById('errorVenue').innerText = '';">Add a new venue</a></td>
<td>{{ formDate.start_date_time}}</td>
<td>{{formDate.link}} {{formDate.this_composition}}</td>
<td>{{formDate.id}}{{formDate.link_description}}</td>
</tr>
{% endfor %}
</tbody>
</table>
では、ユーザーに会場と日付の両方を入力させるにはどうすればよいでしょうか?現在のように、ユーザーが会場フィールドに入力し、対応する日付フィールドを空のままにすると、Django はユーザーを醜い黄色のページにリダイレクトします。
ValidationError at /private/event-edit/1150/
['This field is required.']
Request Method: POST
Request URL: .../event-edit/1150/
Django Version: 3.1
Exception Type: ValidationError
Exception Value:
['This field is required.']
Exception Location: /home/.../.../.../views.py, line 682, in event_edit_view
DEBUG=TRUE が設定されている場合は、それ以外の場合はさらに醜いエラー 500 が発生します。ユーザーがフィールドに入力したときに、入力された会場フィールドの隣の同じ行に「このフィールドに入力してください」という素敵なメッセージを表示する方法はありますか? 「送信」ボタンは?
追伸
レコードに会場がある場合は、日付も入力する必要があるというカスタムの clear() メソッドを宣言する必要がありますか?
------------------------
views.py ファイル内のevent_edit_view関数内に問題があると思います。POSTメソッド条件内のコンテキストでフォームセットを渡す必要があります。
検証エラーを発生させる代わりに、else 部分でこれを実行してください。これで動作するはずです。
def event_edit_view(request, id):
.....
if request.method == "POST":
.....
if MyOtherForm.is_valid() and form_date_event.is_valid():
MyOtherForm.save()
form_date_event.save()
return redirect('my-events')
else:
context = {
[other forms...]
'form_date_event': form_date_event,
}
return render(request, "events/template.html", context)