Py学习  »  Django

如何在django中保存一些数据而不将其添加到表单中?

Jack022 • 7 年前 • 2066 次点击  

我有一个这样的模型:

class MyModel(models.Model):
    rate = models.CharField(max_length=100)
    amount = models.FloatField()
    userid = models.CharField(max_length=100)
    date = models.CharField() //This should be used to save the date

    def save(self): # ALL the signature

        super(MyModel, self).save()

一种形式:

class MyForm(forms.ModelForm):

    rate = forms.CharField()
    amount = forms.FloatField()


    class Meta:
        model = MyModel
        fields = ("rate", "amount")

    def save(self, commit=True):
        send = super(MyForm, self).save(commit=False)
        if commit:
            send.save()
        return send

目前,我的表单正在保存字段 rate 和 amount 在我的数据库中,一旦用户使用表单。我想节省我的数据库 user 提交表单的人、保存表单的日期/时间以及用户不能提交但“自动”保存的某些其他数据。在Django我该怎么做?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/40902
文章 [ 1 ]  |  最新文章 7 年前
Willem Van Onsem
Reply   •   1 楼
Willem Van Onsem    7 年前

首先,如果你提到一个用户,你最好使用 ForeignKey [Django-doc] :

from django import models
from django.contrib.auth import get_user_model

class MyModel(models.Model):
    rate = models.CharField(max_length=100)
    amount = models.FloatField()
    user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE, blank=True, editable=False)
    created = models.DateTimeField(auto_now_add=True)

一 外键 保证它将引用用户。此外,如果您请求的话,它还将惰性地加载用户对象。

你也可以设置 DateTimeField [Django-doc] 与 ** auto_now_add=... parameter [Django-doc] 设置为 True . 这意味着它将在构建记录时获取值。

然后可以在视图中设置用户对象,如:

from app.forms import MyForm
from django.contrib.auth.decorators import login_required

@login_required
def some_view(request):
    if request.method == 'POST':
        form = MyForm(request.POST, request.FILES)
        if form.is_valid():
            form.instance.user = request.user
            form.save()
            return redirect('some_view_name')
    else:
        form = MyForm()
    return render(request, 'some_template.html', {'form': form})

因为您想设置该记录的用户,所以可能应该用 @login_required decorator [Django-doc] .