Django ModelForm,不保存数据
Django ModelForm, not saving data
我正在使用 ModelForm
创建一个表单,然后我正在使用这个表单在数据库中创建一个新实例。但是表单没有保存数据,它只是在提交表单时重新加载页面。
我也在上传图片。
forms.py
from django import forms
from django_summernote.widgets import SummernoteWidget
from events.models import Event
class EventCreateForm(forms.ModelForm):
class Meta:
model = Event
fields = "__all__"
widgets = {
"content": SummernoteWidget(),
}
def __init__(self, *args, **kwargs):
super(EventCreateForm, self).__init__(*args, **kwargs)
for visible in self.visible_fields():
visible.field.widget.attrs["class"] = "form-control"
self.fields["start_datetime"].widget.attrs["class"] += " datetimepicker"
self.fields["finish_datetime"].widget.attrs["class"] += " datetimepicker"
self.fields["image"].widget.attrs["class"] = "custom-file-input"
self.fields["address"].widget.attrs["rows"] = 3
views.py
from django.urls import reverse_lazy
from django.views.generic import ListView
from django.views.generic.edit import FormView
from django.contrib.auth.mixins import LoginRequiredMixin
from events.models import Event
from events.forms import EventCreateForm
class EventListView(LoginRequiredMixin, ListView):
model = Event
context_object_name = "events"
class EventFormView(LoginRequiredMixin, FormView):
template_name = "events/event_form.html"
form_class = EventCreateForm
success_url = reverse_lazy("dashboard:events:home")
event_form.html
<form action="" method="post" enctype="multipart/form-data">
{% csrf_token %}
<div class="card-body">
<div class="form-group">
<label>Title</label>
{{ form.title }}
</div>
<div class="row">
<div class="col-sm-4">
<div class="form-group">
<label>Start Date and Time</label>
{{ form.start_datetime }}
</div>
</div>
<div class="col-sm-4">
<div class="form-group">
<label>Finish Date and Time</label>
{{ form.finish_datetime }}
</div>
</div>
<div class="col-sm-4">
<div class="form-group">
<label for="exampleInputFile">Image</label>
<div class="input-group">
<div class="custom-file">
{{ form.image }}
<label class="custom-file-label">Choose file</label>
</div>
</div>
</div>
</div>
</div>
<div class="form-group">
<label>Address</label>
{{ form.address }}
</div>
<div class="form-group">
<label>Content</label>
{{ form.content }}
</div>
</div>
<!-- /.card-body -->
<div class="card-footer">
<button type="submit" class="btn btn-primary">Publish</button>
<a href="#" class="btn btn-default float-right">Cancel</a>
</div>
</form>
A FormView
不 保存表格。可以重写 .form_valid(…)
方法以指定在表单有效时要执行的操作。在这里使用 CreateView
[Django-doc] 更有意义,它将保存表单并将数据存储到数据库中:
from django.views.generic import <strong>CreateView</strong>
class EventFormView(LoginRequiredMixin<strong>, CreateView</strong>):
template_name = "events/event_form.html"
form_class = EventCreateForm
model = Event
success_url = reverse_lazy("dashboard:events:home")
我正在使用 ModelForm
创建一个表单,然后我正在使用这个表单在数据库中创建一个新实例。但是表单没有保存数据,它只是在提交表单时重新加载页面。
我也在上传图片。
forms.py
from django import forms
from django_summernote.widgets import SummernoteWidget
from events.models import Event
class EventCreateForm(forms.ModelForm):
class Meta:
model = Event
fields = "__all__"
widgets = {
"content": SummernoteWidget(),
}
def __init__(self, *args, **kwargs):
super(EventCreateForm, self).__init__(*args, **kwargs)
for visible in self.visible_fields():
visible.field.widget.attrs["class"] = "form-control"
self.fields["start_datetime"].widget.attrs["class"] += " datetimepicker"
self.fields["finish_datetime"].widget.attrs["class"] += " datetimepicker"
self.fields["image"].widget.attrs["class"] = "custom-file-input"
self.fields["address"].widget.attrs["rows"] = 3
views.py
from django.urls import reverse_lazy
from django.views.generic import ListView
from django.views.generic.edit import FormView
from django.contrib.auth.mixins import LoginRequiredMixin
from events.models import Event
from events.forms import EventCreateForm
class EventListView(LoginRequiredMixin, ListView):
model = Event
context_object_name = "events"
class EventFormView(LoginRequiredMixin, FormView):
template_name = "events/event_form.html"
form_class = EventCreateForm
success_url = reverse_lazy("dashboard:events:home")
event_form.html
<form action="" method="post" enctype="multipart/form-data">
{% csrf_token %}
<div class="card-body">
<div class="form-group">
<label>Title</label>
{{ form.title }}
</div>
<div class="row">
<div class="col-sm-4">
<div class="form-group">
<label>Start Date and Time</label>
{{ form.start_datetime }}
</div>
</div>
<div class="col-sm-4">
<div class="form-group">
<label>Finish Date and Time</label>
{{ form.finish_datetime }}
</div>
</div>
<div class="col-sm-4">
<div class="form-group">
<label for="exampleInputFile">Image</label>
<div class="input-group">
<div class="custom-file">
{{ form.image }}
<label class="custom-file-label">Choose file</label>
</div>
</div>
</div>
</div>
</div>
<div class="form-group">
<label>Address</label>
{{ form.address }}
</div>
<div class="form-group">
<label>Content</label>
{{ form.content }}
</div>
</div>
<!-- /.card-body -->
<div class="card-footer">
<button type="submit" class="btn btn-primary">Publish</button>
<a href="#" class="btn btn-default float-right">Cancel</a>
</div>
</form>
A FormView
不 保存表格。可以重写 .form_valid(…)
方法以指定在表单有效时要执行的操作。在这里使用 CreateView
[Django-doc] 更有意义,它将保存表单并将数据存储到数据库中:
from django.views.generic import <strong>CreateView</strong>
class EventFormView(LoginRequiredMixin<strong>, CreateView</strong>):
template_name = "events/event_form.html"
form_class = EventCreateForm
model = Event
success_url = reverse_lazy("dashboard:events:home")