【问题标题】:How can i save some data in Django without adding it in the form?如何在 Django 中保存一些数据而不将其添加到表单中?
【发布时间】:2019-12-05 23:20:05
【问题描述】:

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

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 中做到这一点?

【问题讨论】:

  • 如果用户不提供值,您想保存数据。例如,如果用户没有输入rate,那么您为此保存一个默认值。是吗?
  • @shafik 让我更好地解释一下:用户输入费率和金额,因此这两个字段保存在数据库中。同时,我想在我的数据库中保存一个用户和一个日期字段,但这些字段不能由用户提交,它们应该是“预定义的”

标签: python django django-models django-forms


【解决方案1】:

首先,如果你引用一个用户,你最好使用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] 设置为**auto_now_add=... parameter [Django-doc] 设置为True。这意味着它将在构造记录时取值。

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

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

【讨论】:

  • 谢谢!在 Django 中做同样的事情是否是一个好习惯,但不是在模型中定义它,而是添加一个具有不可编辑值的“隐藏字段”?
  • @Jack022:隐藏字段是可编辑的,即使您将其设为不可编辑。用户可以简单地更改 DOM 或使用 cURL、邮递员等工具发出 POST 请求。
  • 这样就不安全了;但是如果我用 disabled=True 定义字段,它会安全吗?我会在 5 分钟内接受,谢谢!
  • @Jack022:我认为最好不要向用户公开您不需要公开的内容,因为它可以为您的数据库提供一些“洞察力”。您可以将user 字段设为editable=False,因此默认情况下它不会显示在您的表单中。
  • @Jack022:同样的,你可以在字段中用models.CharField(max_length=128, default='some default value')指定一个默认值,或者在视图中用form.instance.column_name = 'some other default value'指定一个默认值。
猜你喜欢
  • 2021-07-06
  • 2017-12-26
  • 1970-01-01
  • 2014-01-09
  • 1970-01-01
  • 1970-01-01
  • 2020-05-23
  • 2021-04-26
  • 1970-01-01
相关资源
最近更新 更多