Django表单未保存,终端显示数据并添加了保存方法

时间:2018-08-09 11:26:41

标签: django django-models django-forms

我要做的就是保存简单的表格。一切看起来都很好,但是在单击“保存”并重新呈现表单之后,数据库中没有新交易。也不会引发任何错误消息。

起初,我认为用户有问题,但看起来也不错。正在阅读有关此主题的很多文档,但尚未找到问题所在。

感谢您的帮助,请告诉我是否还有其他可以添加的内容。

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)

3 个答案:

答案 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)

感谢大家的帮助!

我知道这也许不是你们所希望的完美解决方案,但至少有一些解决方案。