如何为一个模板实现多种形式

时间:2019-10-03 20:57:56

标签: django django-forms

我是Django的新手。我的博客页面上有多种用于不同计算的表格(例如Form1,Form2,Form3等)。 每个博客帖子(post / 1)在页面上都会有一个按钮,该链接带有一个链接,用于打开该帖子的特定表单模板(post_form.html)(例如post / 1 / form /),其中包含表单。 (Post1-Form1,Post2-Form 2,等等。)

有人可以帮助您实现此逻辑吗?如何更好地设置网址,模型和表格?

models.py

class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    date_posted = models.DateTimeField(default=timezone.now)
    category = models.ForeignKey(Category , on_delete=models.CASCADE, default='Concrete')
    author = models.ForeignKey(User , on_delete=models.CASCADE)
    image = models.ImageField(default='default.jpg', upload_to='calc_pics')
    formId = models.IntegerField()

class L_section_prop_calc(models.Model):
    name = models.CharField(max_length=100, unique=True)
    tf = models.DecimalField(max_digits=5, decimal_places=3)
    tw = models.DecimalField(max_digits=5, decimal_places=3)
    height = models.DecimalField(max_digits=5, decimal_places=3)

urls.py

path('post/<int:pk>/', PostDetailView.as_view(), name='post-detail'),

forms.py

class Calc_L_Section_Prop_Form(forms.ModelForm):
class Meta:
    model = L_section_prop_calc
    fields = ['tw','tf','height']

我不知道是否需要为每个表单创建一个模型。有更好的方法吗?

Thx

1 个答案:

答案 0 :(得分:0)

这就是我的假设,因为您的问题很难理解。您有Post个对象,每个对象都有一个相关的Calc_L_Section_Prop_Form对象。您想要一个从/post/1/到具有相关Calc_L_Section_Prop_Form形式的页面的链接。

如果这是正确的,那么这就是我要这样做的方式。

在您的Calc_L_Section_Prop_Form模型上添加一个字段,以将其连接到您的帖子。如果每个博客帖子仅进行一次计算,则可以使用OneToOneField。您其余的模型都很好。

models.py

...

class L_section_prop_calc(models.Model):
    post = models.OneToOneField(Post, models.CASCADE)
    ...

创建一个视图以处理用于计算的表格。

views.py

from django.shortcuts import get_object_or_404

...

class CalcUpdateView(generic.UpdateView):
    fields = ['tw','tf','height']
    model = L_section_prop_calc

    def get_object(self):
        return get_object_or_404(
            self.get_queryset(),
            post__pk=self.kwargs['pk'],
        )

最后放入另一个path以使用此视图。

urls.py

    ...
    path('post/<int:pk>/form/', CalcUpdateView.as_view(), name='calc-update'),