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

时间:2019-07-28 10:18:22

标签: python django django-models django-forms

我有一个看起来像这样的模型:

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

实际上,一旦用户使用表单,我的表单就会将字段rateamount保存在数据库中。我想在数据库中保存提交表单的user,保存表单的日期/时间以及其他一些用户不能提交但可以“自动”保存的数据。我该如何在Django中做到这一点?

1 个答案:

答案 0 :(得分:2)

首先,如果您提及用户,则最好使用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)

ForeignKey保证将引用用户。此外,如果您请求,它也会延迟加载用户对象。

您也可以在DateTimeField [Django-doc]设置为True的情况下设置**auto_now_add=... parameter [Django-doc]。这意味着在构造记录时将使用该值。

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

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]装饰视图。