以Django模型形式多次渲染特定字段

时间:2020-04-16 09:50:59

标签: python django python-3.x django-forms django-views

我正在学习Django,遇到了挑战。我有一个模型,其中我想多次渲染特定字段,具体取决于用户要填充的数量,而其余模型字段保持不变。以下是示例模型。我想以这样的方式呈现模型形式:字段'building''tour_date'可以根据需要重复多次,而'client_name''client_email'保持相同。< / p>

我查看了inlineformset_factory,但我认为它需要一个父模型。尽管我希望拥有'extra''can_delete'之类的某些功能,但我认为它没有用。保存的记录必须另存为'Tour'表中的新行。

以下示例所面临的另一个挑战是,“ building”字段必须为下拉列表。我在下面提供了forms.py供参考。

如何在Django 3.0中编写视图并以相同的形式多次渲染两个字段'building''tour_date'?需要一些帮助和指导。

models.py:

class Tour(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField(max_length=100)
building = models.CharField(max_length=255)
tour_date = models.DateField()
...

class Meta:
    managed = True
    unique_together = ('name', 'building')

forms.py:

class TourForm(forms.ModelForm):
    building = forms.ModelChoiceField(
        widget=forms.Select,
        queryset=Country.objects.filter(city='ABC'),
        required=True
    )

    class Meta:
        model = Tour
        fields = ['name', 'email', 'building','tour_date']

views.py:

def add_tours(request):
    if request.method == 'POST':
        form = TourForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('tours-browse')
    else:
        form = TourForm()
    template = 'data/tours_add.html'
    context = {'form': form}
    return render(request, template, context)

2 个答案:

答案 0 :(得分:1)

执行此操作的最佳方法是根据应用程序使用ManytoMany关系或多对多关系,这将是一项艰巨的工作,但值得,请参见https://docs.djangoproject.com/en/3.0/topics/db/examples/many_to_many/

答案 1 :(得分:0)

我有一个模型,其中我想根据用户要填充的数量多次渲染特定字段,而其余模型字段保持不变。

这不是它的工作方式。数据库字段是原子的-它们仅包含一个值。如果需要不确定数量的值,请使用具有一对多(外键)或多对多关系的相关模型。 IOW,您需要一个“ TourDate”和“ Building”模型,两者在“ Tour”上均具有ForeignKey或ManyToMany关系。然后,您将能够为这些相关模型使用表单集。