【问题标题】:Django: Save forms cleaned_data with foreign key as session itemsDjango:将带有外键的表单cleaned_data保存为会话项
【发布时间】:2020-10-07 16:44:49
【问题描述】:

我有一个具有许多属性的 ModelForm - 在 CreateView form_valid 方法中,我试图将用户表单输入保存为会话数据(如果他们访问,我会在 get_initial 方法中检查再次形成)

模型形式:

class OrgForm(forms.ModelForm):
    """Form definition for a Org."""

    class Meta:
        """Meta definition for OrgForm."""

        model = Org
        fields = (
            "full_name",
            "short_name",
            "feature",
            "state",
            "email",
        )

查看:

class OrgCreateView(CreateView):
    "CreateView for OrgForm"
    model = Org
    form_class = OrgForm
    success_url = "/home/"

    def form_valid(self, form):
        response = super().form_valid(form)
        # Set the form data to session variables
        responses = {}
        for k, v in form.cleaned_data.items():
            responses[k] = v
        self.request.session["org_form_data"] = responses
        return super().form_valid(form)

    def get_initial(self):
        initial = super(OrgCreateView, self).get_initial()
        # Check for any existing session data
        # This is present if they had filled this out
        # and then came back again later to fill out again
        if "org_form_data" in self.request.session:
            # They have data - loop through and fill it out
            for key, value in self.request.session["org_form_data"]:
                initial[key] = value
        return initial

型号:

class Org(models.Model):
    """Model definition for Org."""

    full_name = models.CharField(max_length=150)
    short_name = models.CharField(max_length=25, blank=True, null=True)
    state = models.CharField(max_length=50)
    is_active = models.BooleanField(default=False)
    feature = models.ForeignKey(Feature, on_delete=models.PROTECT)
    created_at = models.DateTimeField(auto_now=False, auto_now_add=True)
    last_updated = models.DateTimeField(auto_now=True, auto_now_add=False)
    email = models.EmailField()

我有一个具有外键的属性 - 所以当我保存表单时出现错误:

Object of type Feature is not JSON serializable

我不确定如何最好地解决该错误 - 或者即使这是解决问题的正确方法。

感谢任何帮助!

【问题讨论】:

  • 解决了这个问题吗?面临类似的问题。
  • 否定。发布此消息后不久,不得不前往另一个项目。如果我回到它并找出答案,我会发布。否则,它仍然是开放的。

标签: python django django-models django-forms


【解决方案1】:

您可以在 Django 中使用会话:

会话配置

要在 Django 中设置会话,您需要在 settings.py 中添加两件事:

‘django.contrib.sessions.middleware.SessionMiddleware   'to MIDDLEWARE
'django.contrib.sessions   'to INSTALLED_APPS.

运行python manage.py migrate 来填充表格。 该表有三列:

  • session_key
  • 会话数据
  • 过期日期

读写会话数据

Django 请求对象有一个会话属性,其作用类似于字典。

设置会话数据

request.session['user_id'] = ‘20’
request.session['team'] = ‘Barcelona’

点赞request.session['your cookie name'] = your value

读取会话数据

request.session.get('user_id') # returns ‘20’
request.session.get('team') # returns ‘Barcelona’ 

删除会话数据

del request.session['user_id']
del request.session['user_id']

我试过这个方法,效果很好! 您可以向 Django 询问会话值:

if request.session('cookiename') == True:
    print("It is TRUE!")

【讨论】:

    猜你喜欢
    • 2012-01-17
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2010-11-15
    • 2021-12-21
    • 2013-10-11
    相关资源
    最近更新 更多