我遇到一些问题,让我的表单让用户选择一个值,而不是在文本框中输入。我正在尝试创建一个工具签出事务,它需要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中的对象而不是一次显示两个表单,那么我也可以使用一个表单。只是不确定最好的方法来解决这个问题。
谢谢!
答案 0 :(得分:0)
我改变了方法并最终解决了这个问题。我在使用我的模型方面不正确。我为每个数据库表创建了一个模型。但是,我需要做的是为每个要执行的任务创建一个模型。例如,CheckIn和CheckOut都使用ToolTransaction模型。通过制作CheckIn模型(与上面的ToolTransaction模型相同)和CheckOut模型,我能够将反向查找添加到正确的url / view以完成操作。我还组合了一个html构建的表单,我将数据放入其中,并使我从视图中从查询集中检索到的数据不可编辑。然后我继续使用表单ToolCheckoutCreateForm。我的html表格保存了我的借款人信息。