1

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 %}
arne
  • 225
  • 5
  • 18
  • These relationships don't make sense. System doesn't have a `collector` field; it is Collector that has a `system`. – Daniel Roseman Apr 10 '18 at 11:59
  • Can a collector be part of multiple systems? Make collector a ManyToManyField on the System – Ramkishore M Apr 10 '18 at 11:59
  • A certain collector can only be part of one and only one system. However various systems can have collectors of the same collector TYPE. @Daniel yes thats a good point. But how to change my code so as to get it working correctly? – arne Apr 10 '18 at 12:05
  • You need to move the ForeignKey. If a collector can only be part of one system, then you need an FK field on Collector pointing at System, not the other way round. – Daniel Roseman Apr 10 '18 at 12:11

1 Answers1

0

I’m not exactly sure what your going for, but if you are using ModelForm, I don’t think you are setting your model up correctly. Create a models.CharField() with a choices=YOUR_CHOICES as defined in django models

Carl Brubaker
  • 1,602
  • 11
  • 26