其他模型

时间:2017-03-04 16:24:47

标签: python django django-models

我正在玩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视图后,新添加的类别名称不会显示在费用类别字段的下拉列表中。

然而,在关闭服务器并将其重新启动后,最近添加的类别在上述下拉列表中可用。

我可以请你帮我解决问题所在吗?

2 个答案:

答案 0 :(得分:1)

ForeignKeydjango.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)

我不确定它是否是解决它的最优雅方式,但它的工作正常。如果有更好的解决方案,请赐教:)