我希望用户能够从下拉列表中选择太阳能收集器类型。此时,用户可以从 SystemUpdateView() 的下拉列表中选择两种收集器类型,但是该值显然没有存储到数据库中。system.collector 变量保持为空,下拉列表不记得选择的值。
简化的例子有两个模型,太阳能收集器模型和太阳系模型,即:
class Collector(models.Model):
system = models.ForeignKey('system.System', related_name='collectors', on_delete=models.CASCADE)
collector_name = models.CharField(default='', max_length=200)
collector_area = models.FloatField(default=0)
@classmethod
def create( cls,
system,
collector_name,
collector_area):
collector = cls(system = system,
collector_name = collector_name,
collector_area = collector_area)
return collector
class System(models.Model):
system_name = models.CharField(default='', max_length=200)
@classmethod
def create( cls, system_name):
system = cls(system_name = system_name)
system.save()
# Create the collector objects
Collector.objects.all().delete()
collectors = []
collectors.append( Collector.create(system=system,
collector_name = "Solarus PVT collector 11s",
collector_area = 2.2))
collectors.append( Collector.create(system=system,
collector_name = "Solarus PVT collector 1.0",
collector_area = 2.31))
collectors_objects = Collector.objects.bulk_create(collectors)
collector_objects.save()
return system
SystemForm 给出如下:
class SystemForm(forms.ModelForm):
collector = forms.ModelChoiceField(required=False, queryset=Collector.objects.all(), label='Collector')
class Meta:
model = System
fields = [
'collector',
'system_name'
]
创建和更新视图由以下给出:
class SystemUpdateView(LoginRequiredMixin, UpdateView):
model = System
template_name = 'system/detail-update.html'
form_class = SystemForm
def get_object(self):
return get_object_or_404(System, pk=self.kwargs['pk_system'])
def form_valid(self, form):
system = self.get_object()
system.system_name = form.cleaned_data['system_name']
system.collector = form.cleaned_data['collector']
system.save()
return HttpResponseRedirect(reverse('system:detail', args=(system.id,)))
class SystemCreateView(LoginRequiredMixin, CreateView):
model = System
template_name = 'system/create.html'
form_class = SystemForm
def form_valid(self, form):
system = System.create(system_name = form.cleaned_data['system_name'])
system.save()
return HttpResponseRedirect(reverse('system:detail', args=(system.id,)))
以及模板更新详细视图模板:
{% extends 'base.html' %}
{% block content %}
<h3>Selected collector: {{system.collector}}</h3>
<h2>Make changes</h2>
<form method='POST'> {% csrf_token %}
{{ form.as_p }}
<button type='submit'>Save</button>
</form>
{% endblock %}