我正在玩django框架并尝试创建一些费用跟踪应用程序作为练习。
我有两个模型:类别和费用:
class Category(models.Model):
name = models.CharField(max_length=50)
class Expense(models.Model):
categories_list = Category.objects.order_by('name')
categories_tuples = ((x.name, x.name) for x in categories_list)
category = models.CharField(max_length=50, choices=categories_tuples)
add_date = models.DateField()
amount = models.DecimalField(max_digits=10, decimal_places=2)
我还有两种表格可以添加新类别和新费用:
class ExpenseForm(ModelForm):
class Meta:
model = Expense
fields = ['category', 'add_date', 'amount']
class CategoryForm(ModelForm):
class Meta:
model = Category
fields = ['name']
我在不同的视图中使用这些表单:
def new_expense(request):
if request.method == "POST":
form = ExpenseForm(request.POST)
if form.is_valid():
expense = form.save(commit=False)
expense.save()
return redirect('index')
else:
form = ExpenseForm()
return render(request, 'expenses/new_expense.html', {'form': form})
def new_category(request):
if request.method == "POST":
form = CategoryForm(request.POST)
if form.is_valid():
expense = form.save(commit=False)
expense.save()
return redirect('index')
else:
form = CategoryForm()
return render(request, 'expenses/new_category.html', {'form': form})
因此,所需的行为是我可以添加具有指定名称的新类别,之后应该可以使用新的类别数据库条目中的数据添加新的费用。
问题是在new_category视图中添加新类别并切换到new_expense视图后,新添加的类别名称不会显示在费用类别字段的下拉列表中。
然而,在关闭服务器并将其重新启动后,最近添加的类别在上述下拉列表中可用。
我可以请你帮我解决问题所在吗?
答案 0 :(得分:1)
ForeignKey
由django.forms.ModelChoiceField
表示,它是ChoiceField,其选择是模型QuerySet。摘自documentation。
您的Expense Model
可能是这样的:
class Expense(models.Model):
category = models.ForeignKey(Category)
add_date = models.DateField()
amount = models.DecimalField(max_digits=10, decimal_places=2)
答案 1 :(得分:0)
在阅读了Hugo的回复之后,我做了一些挖掘并提出了可行的解决方案:
class Category(models.Model):
name = models.CharField(max_length=50)
def __unicode__(self):
return '%s' % self.name
class Expense(models.Model):
category = models.ForeignKey(Category)
add_date = models.DateField()
amount = models.DecimalField(max_digits=10, decimal_places=2)
我不确定它是否是解决它的最优雅方式,但它的工作正常。如果有更好的解决方案,请赐教:)