我需要通过逐步处理来实现交易,其中用户可以在步骤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不同,数据库中的行不完整。
我什至不知道自己是否还在正确的轨道上。我已经做了一段时间的研究,但仍然没有任何答案。请帮忙!
答案 0 :(得分:0)
首先,您忘记了required argument for your CharField,max_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。