Django来自一个模型的多个ModelForms

时间:2019-10-29 09:26:27

标签: django django-models django-forms django-templates django-views

我需要通过逐步处理来实现交易,其中用户可以在步骤1中输入详细信息,然后处理输入的数据,这将进行一些计算。然后,用户可以继续执行显示初始结果的步骤2,并且他/她可以输入其他参数来操纵结果。我需要将所有用户输入存储在一个模型中,以便如果用户取消该过程,则将删除最初存储的所有数据。

我是django和python的新手,所以如果有人知道如何解决此问题,我将不胜感激。

这是我到目前为止尝试过的:

在我的 models.py 中,我有:

class Calculate(models.Model):
    date_created = models.DateField(auto_now_add=True)
    user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
    csv = models.FileField(upload_to='files/')

    CHOICES = (
       ('none', '(none)'),
       ('c1', 'C-1'),
       ('c2', 'C-2'),
       ('c3', 'C-3'),
    )

    param1 = models.CharField(max_length=1, choices=CHOICES, blank=False, default='c1')
    param2 = models.CharField(max_length=1, choices=CHOICES, blank=False, default='c2')
    param3 = models.CharField(max_length=1, choices=CHOICES, blank=False, default='none')

在我的 forms.py 中,我有:

class DetailsInputForm(forms.ModelForm):
    class Meta:
        model = Analysis
        fields = ('date_created', 'csv',)

class ParamInputForm(forms.ModelForm):
    class Meta:
        model = Analysis
        fields = ('param1', 'param2', 'param3',)

在我的 views.py 中,我有:

 class DetailsInputView(LoginRequiredMixin, CreateView):
     model = Calculate
     form_class = DetailsInputForm
     template_name = 'step1.html'
     login_url = 'login'
     success_url = reverse_lazy('step2')

 class ParamInputView(LoginRequiredMixin, CreateView):
     model = Calculate
     form_class = ParamsInputForm
     template_name = 'step2.html'
     login_url = 'login'

在我的html模板中,我有:

 <div class="tab-pane">
      {% block step1 %}
      # block in step1.html
      {% endblock %}
 </div>
 <div class="tab-pane">
      {% block step2 %}
      # block in step2.html
      {% endblock %}
 </div>

运行代码时,出现编程错误,指出db列param1,param2和param3不存在。我怀疑这是因为由于使用的ModelForm不同,数据库中的行不完整。

我什至不知道自己是否还在正确的轨道上。我已经做了一段时间的研究,但仍然没有任何答案。请帮忙!

2 个答案:

答案 0 :(得分:0)

首先,您忘记了required argument for your CharFieldmax_length。这是可以保存到该CharField中的最大字符数。

将您的字段更改为以下内容:

param1 = models.CharField(max_length=255)

或者您要分配的长度。

如果要存储大量文本,请改用TextField

第二,大多数情况下,当您收到错误消息“列 x 不存在”时,这意味着您忘记了应用迁移。

先运行python manage.py makemigrations,再运行python manage.py migrate,将生成迁移文件,然后将其按此顺序应用于数据库。

每次对Django应用程序中的任何模型进行任何更改时,都要执行此操作。

答案 1 :(得分:0)

如果我理解正确,则不应将CreateView用于第二个视图(ParamInputView),因为您想更新由第一个视图创建的对象(数据库行)。您可能需要UpdateView,并将第一个创建的对象的ID传递到第二个URL。

相关问题