我要做的就是保存简单的表格。一切看起来都很好,但是在单击“保存”并重新呈现表单之后,数据库中没有新交易。也不会引发任何错误消息。
起初,我认为用户有问题,但看起来也不错。正在阅读有关此主题的很多文档,但尚未找到问题所在。
感谢您的帮助,请告诉我是否还有其他可以添加的内容。
create.html
<form id='trade_create_view' method='POST' action='.'>
{% csrf_token %}
{{ form.as_p }}
<input type='submit' value='Submit' >
</form>
views.py
def trade_create_view(request):
form = TradeForm(request.POST or None, instance=request.user)
if form.is_valid():
print(form.cleaned_data)
form.save()
form = TradeForm()
context = {
'form': form,
}
return render(request, "tj/cp/trade/create.html", context)
forms.py
from django import forms
from .models import Trade
class TradeForm(forms.ModelForm):
class Meta:
model = Trade
fields = [
'user',
'target_size',
'target_entry',
'target_exit',
'ticker',
'exchange',
'short',
'comments',
'size',
'entry_price',
'exit_price',
'entry_date',
'exit_date',
'fees',
'permission',
]
exclude = ['user',]
model.py
class Trade(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, null=False)
comments = models.TextField(max_length=10000, blank=True, null=True)
created = models.DateField(auto_now_add=True)
last_edit = models.DateField(auto_now=True)
#general trade info
ticker = models.ForeignKey(Ticker, on_delete=models.CASCADE)
short = models.BooleanField(default=False)
exchange = models.ForeignKey(Exchange, on_delete=models.CASCADE)
#target trade outline
target_size = models.DecimalField(null=True, blank=True, max_digits=50, decimal_places=20)
target_entry = models.DecimalField(null=True, blank=True, max_digits=50, decimal_places=20)
target_exit = models.DecimalField(null=True, blank=True, max_digits=50, decimal_places=20)
#real trade
size = models.DecimalField(null=True, blank=True, max_digits=50, decimal_places=20)
entry_price = models.DecimalField(null=True, blank=True, max_digits=50, decimal_places=20)
exit_price = models.DecimalField(null=True, blank=True, max_digits=50, decimal_places=20)
entry_date = models.DateField(blank=True, null=True, default=datetime.now)
exit_date = models.DateField(blank=True, null=True, default=datetime.now)
fees = models.DecimalField(blank=True, null=True, max_digits=50, decimal_places=20)
PER_OPTIONS = [
('0', 'Public'),
('1', 'Private'),
('2', 'Mentor Only'),
]
permission = models.CharField(max_length=1, choices=PER_OPTIONS, default=0)
答案 0 :(得分:1)
我认为您只需要检查您的请求是帖子还是get方法:
def trade_create_view(request):
if request.method == "POST":
form = TradeForm(request.POST or None, instance=request.user)
if form.is_valid():
print(form.cleaned_data)
form.save()
form = TradeForm()
context = {
'form': form,
}
return render(request, "tj/cp/trade/create.html", context)
OR
您只需在视图中添加一个post def,如下所示:
def post(self, request):
form = TradeForm(request.POST or None, instance=request.user)
if form.is_valid():
print(form.cleaned_data)
form.save()
form = TradeForm()
...
答案 1 :(得分:0)
此行没有意义:TradeForm(request.POST or None, instance=request.user)
在表单中使用instance
时,将给出相关对象的实例。但是您的对象是Trade
而不是User
。您可以选择不同的方法来解决问题,我给出一种:
def trade_create_view(request, id):
form = TradeForm()
if request.method == "POST":
trade, created = Trade.objects.get_or_create(id=id) # you get or create your instanced Trade
form = TradeForm(request.POST, instance=trade) # you give to your form the instance of your Trade
if form.is_valid():
print(form.cleaned_data)
form.save()
context = {
'form': form,
}
return render(request, "tj/cp/trade/create.html", context)
我任意地使用id
来查询对象Trade
。据我了解您的代码,您可以使用此函数与Trade
创建和编辑任何TradeForm
对象。
get_or_create是Django网站上的文档。如果您什么时候不使用它,可以使用Trade.objects.get(id=id)
,您需要检查该对象之前是否存在。
但是,如果您何时创建对象Trade
,只需删除instance=XXX
,然后使用TradeForm(request.POST)
。实例用于获取数据库中的对象,并用您的表单发布和处理的新数据覆盖。
答案 2 :(得分:0)
因此,我将所有内容切换到了基于类的视图,由于某种原因,现在它可以完美,立即地运行。
更令人震惊的是,当我在第一次基于类的View测试之后再次检查我的数据库时,现在出现了大约15个测试交易(相信我,我在每次功能视图测试后都检查/刷新了数据库) )。所以..我猜它一直都很好,因为我确实阅读了10x文档,以弄清楚出了什么问题并且感到非常沮丧。不好的是数据库要花几个小时才能更新,或者它们可能被冻结在其他地方。我还无法解释。
新的views.py
class TradeCreateView(CreateView):
template_name = "tj/cp/trade/create.html"
form_class = TradeForm
queryset = Trade.objects.all()
def form_valid(self, form):
print(form.cleaned_data)
return super().form_valid(form)
感谢大家的帮助!
我知道这也许不是你们所希望的完美解决方案,但至少有一些解决方案。