【问题标题】:ModelChoiceField in conjuction with ModelFormModelChoiceField 与 ModelForm 结合使用
【发布时间】:2018-09-20 00:53:20
【问题描述】:

我希望用户能够从下拉列表中选择太阳能收集器类型。此时,用户可以从 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 %}

【问题讨论】:

  • 这些关系没有意义。系统没有collector 字段;它是具有 system 的 Collector。
  • 收集器可以是多个系统的一部分吗?使收集器成为系统上的 ManyToManyField
  • 某个收集器只能是一个且只能是一个系统的一部分。然而,不同的系统可以具有相同收集器类型的收集器。 @Daniel 是的,这是一个很好的观点。但是如何更改我的代码以使其正常工作?
  • 您需要移动 ForeignKey。如果一个收集器只能是一个系统的一部分,那么你需要一个指向系统的收集器上的 FK 字段,而不是相反。

标签: django modelform modelchoicefield


【解决方案1】:

我不确定你的目的是什么,但如果你使用 ModelForm,我认为你的 model 设置不正确。使用choices=YOUR_CHOICES 中定义的django models 创建models.CharField()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    • 2015-10-09
    相关资源
    最近更新 更多