具有外键相关数据的Django表单

时间:2016-09-02 04:22:53

标签: django django-models django-forms django-views

我遇到一些问题,让我的表单让用户选择一个值,而不是在文本框中输入。我正在尝试创建一个工具签出事务,它需要ToolID,签出工具的数量和PartyID。我想让用户能够看到用户名字和姓氏的列表,而不是选择PartyID。 名字和姓氏是必需的,但是当我创建一个包含这些字段的表单时,它会给我一个输入文本框。我相信我宁愿让用户从下拉选项中选择所需的用户。任何帮助,将不胜感激。

模特:

class Party(models.Model):
PartyID=models.AutoField(primary_key=True, db_column='PartyID')
FirstName=models.CharField(max_length=100, null=False)
LastName=models.CharField(max_length=100, null=False)
PhoneNumber=models.CharField(max_length=25, null=False)
Organization=models.CharField(max_length=100, null=True)
Deleted=models.BooleanField(default=0)

objects=models.Manager()

class Meta:
    managed=True
    db_table='Party'

def __unicode__(self):
    return str(self.PartyID)

def get_absolute_url(self):
    return reverse("ToolSearch:borrowerUpdate", kwargs={"pk": self.PartyID})

class ToolTransaction(models.Model):
CheckOutID=models.AutoField(primary_key=True)
ToolID=models.ForeignKey(Tool, db_column='ToolID', on_delete=models.CASCADE,)
PartyID=models.ForeignKey(Party, db_column='PartyID', on_delete=models.CASCADE,)
Quantity=models.IntegerField(null=False)
CheckOutDate=models.DateField(null=False, default=datetime.datetime.now)
CheckInDate=models.DateField(null=True)
Deleted=models.BooleanField(default=0)
objects=ActiveTransactionManager()
#objects=models.Manager()

class Meta: 
    managed=True
    db_table='ToolTransaction'
    ordering=('CheckOutID',)

def __unicode__(self):
    return str(self.CheckOutID)

def get_absolute_url(self):
    return reverse("ToolSearch:toolCheckin", kwargs={"pk": self.CheckOutID})

class Tool(models.Model):
ToolID=models.CharField(max_length=100, primary_key = True, unique=True, db_column='ToolID')
Quantity=models.IntegerField(null=False)
Location=models.CharField(max_length=100, null=False)
CategoryID=models.IntegerField(null=True)
Deleted=models.BooleanField(default=0)

objects=models.Manager()

class Meta:
        managed=True
        db_table='Tool'

def __unicode__(self):
    return self.ToolID

def get_absolute_url(self):
    return reverse("ToolSearch:toolSearchResults", kwargs={"pk": self.ToolID})

表格:

class BorrowerSelectForm(forms.ModelForm):
class Meta:
    model = Party
    fields = [
        "FirstName",
        "LastName",
        "PhoneNumber"
    ]

class ToolCheckoutCreateForm(forms.ModelForm):
class Meta:
    model = ToolTransaction
    fields = [
        "ToolID",
        "Quantity",
        "PartyID",
    ]

查看:

def tool_checkout(request):
    queryset = Party.objects.all()
    form = ToolCheckoutCreateForm(request.POST or None)
    form2 = BorrowerSelectForm(request.POST or None)
    if form.is_valid():
        instance=form.save(commit=False)
        instance.save()
        messages.success(request, "Tool Checked Out succesfully")
    context={
        "form": form,
        "form2": form2
    }
    return render(request, "toolcheckout.html", context)

如果我可以让ToolCheckOutCreateForm也引用Party Model中的对象而不是一次显示两个表单,那么我也可以使用一个表单。只是不确定最好的方法来解决这个问题。

谢谢!

1 个答案:

答案 0 :(得分:0)

我改变了方法并最终解决了这个问题。我在使用我的模型方面不正确。我为每个数据库表创建了一个模型。但是,我需要做的是为每个要执行的任务创建一个模型。例如,CheckIn和CheckOut都使用ToolTransaction模型。通过制作CheckIn模型(与上面的ToolTransaction模型相同)和CheckOut模型,我能够将反向查找添加到正确的url / view以完成操作。我还组合了一个html构建的表单,我将数据放入其中,并使我从视图中从查询集中检索到的数据不可编辑。然后我继续使用表单ToolCheckoutCreateForm。我的html表格保存了我的借款人信息。