Django 表单与 ModelChoiceField

0 投票
1 回答
579 浏览
提问于 2025-04-17 21:31

我研究了好几天,还是对创建一个涉及4个表格的表单感到困惑,这4个表格都是通过外键连接的。我甚至不确定自己是不是在用正确的方法。

我应该使用forms.Form还是ModelForm呢?我想要的功能我相信是很常见的,但我所有的尝试都没有成功。看起来我把事情搞得比实际复杂,因为这4个表格都是有关联的。

说重点:要创建一个工单,首先选择一个建筑,然后在这个建筑里选择一个单元,再从这个单元里的租户中选择一个来电者。最后收集所有数据并保存工单。

我在使用Django 1.6

# models.py
class Building(models.Model):
    name = models.CharField(max_length=30)
    address = models.CharField(max_length=200)
    ...

def __unicode__(self):
    return self.name


class Unit(models.Model):
    name = models.ForeignKey(Building)
    unit = models.CharField(max_length=30)
    ...

    def __unicode__(self):
        return self.unit

class Tenant(models.Model):
    unit = models.ForeignKey(Unit)
    name = models.ForeignKey(Building)
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    ...

    def __unicode__(self):
        return u'%s %s' % (self.first_name, self.last_name)


class WorkOrder(models.Model):
    name = models.ForeignKey(Building)
    unit = models.ForeignKey(Unit)
    ordernum = models.AutoField(primary_key=True)
    ...

    def __unicode__(self):
        return self.unit

forms.py

# forms.py

class WorkOrderForm(forms.Form):
    building_choice = forms.ModelChoiceField(queryset=Building.objects.all(),
                                             empty_label='Pick a building',
                                             )

    def __init__(self, *args, **kwargs):
        super(WorkOrderForm, self).__init__(*args, **kwargs)
        self.fields['building_choice'].label = 'Building'


    unit_choice = forms.ModelChoiceField(queryset=Unit.objects.(????),
                                         empty_label='Pick a unit',
                                         )

    def __init__(self, *args, **kwargs):
        super(WorkOrderForm, self).__init__(*args, **kwargs)
        self.fields['unit_choice'].label = 'Unit'

    caller_choice = forms.ModelChoiceField(queryset=Tenant.objects.(????),
                                       empty_label='Who called',
                                       )

    def __init__(self, *args, **kwargs):
        super(WorkOrderForm, self).__init__(*args, **kwargs)
        self.fields['caller_choice'].label = 'Tenant'

views.py(未完成)

#views.py
def create(request):
    if request.method == 'POST':
        form = WorkOrderForm(request.POST)
        if form.is_valid():
            workorder = WorkOrder(name=form.cleaned_data['name'],
                                 unit=form.cleaned_data['unit'],
                                 call_date=form.cleaned_data['call_date'],
                                 caller=form.cleaned_data['caller'],
                                 problem_desc=form.cleaned_data['problem_desc'])
            workorder.save()

            return HttpResponseRedirect('/workorder/')
    else:
        form = WorkOrderForm()
    return render(request, 'workorder_form.html', {'form': form})

如果有人能告诉我该怎么做,我将非常感激。

1 个回答

1

我发这个问题已经有一段时间了,不过我找到一个适合我的需求的Django包,叫做 django-clever-selects。它的文档和示例项目都有很好的注释。感谢之前帮助我的所有人。

撰写回答