I want the user to be able to select a Solar Collector type from a dropdownlist. At this point the user is able to select two collector types from the dropdownlist in the SystemUpdateView() but however this value is apparently not stored into the database. The system.collector variable stays empty and the dropdownlist does not remember the chosen value.
The simplified example has two models, the solar Collector model and the solar System model, i.e.:
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
The SystemForm is given as:
class SystemForm(forms.ModelForm):
collector = forms.ModelChoiceField(required=False, queryset=Collector.objects.all(), label='Collector')
class Meta:
model = System
fields = [
'collector',
'system_name'
]
The create and update views are given by:
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,)))
And the template update-detail view template:
{% 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 %}