【问题标题】:Store the user who submitted the form into the same table?将提交表单的用户存储到同一个表中?
【发布时间】:2016-10-28 21:28:15
【问题描述】:

我正在寻找存储负责表单提交的用户名称的最可取的方法,以便我可以轻松地按用户名组织他们提交的表单,就像每个用户的“帐户设置”一样。

我已经搜索过,但解决方案非常分散,所有关于此的帖子都指的是旧版本以及每个 Django 版本中更改的最佳解决方案。我仍在学习 Django 的基础知识,这可能无济于事。

这是我的views.py:

def add(request):
    title = 'Add Reddit Account'
    # ADD FORM
    form = AddRedditForm(request.POST or None)
    instance = form.save(commit=False)
    instance.user = request.user
    instance.save()
    if request.method == "POST":
        print(request.POST)

    context = {
        "form": form,
        "title": title,
        "user": instance.user
    }
    return render(request, "addreddit/add.html", context)

还有我的models.py:

from django.db import models

class Account(models.Model):
    user_name = models.CharField(max_length=20)
    password = models.CharField(max_length=18)
    secret = models.CharField(max_length=100)
    tag = models.CharField(max_length=20, blank=True)
    timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)
    user = models.ForeignKey('auth.User', null=True)

    def __str__(self): #Python 3.3 is __str__
        return str(self.user)
        return self.user_name
        return self.password
        return self.secret
        return self.tag
        return self.timestamp

最后,forms.py 是相关的:

from django import forms
from .models import Account

class AddRedditForm(forms.ModelForm):
    class Meta:
        model = Account
        fields = ['user_name','password','secret','tag']
    user_name = forms.CharField(required=True)
    password = forms.CharField(widget=forms.PasswordInput,required=True)
    secret = forms.CharField(required=True)
    tag = forms.CharField(required=False)

这似乎工作得很好,除了保存在表单中的唯一是用户,而不是其他信息。


建议编辑:

from django.conf import settings
from django.core.mail import send_mail
from django.shortcuts import render, redirect
from .forms import AddRedditForm


# Create your views here.
def add(request):
    title = 'Add Reddit Account'
    # ADD FORM
    if request.method == "POST":
        form = AddRedditForm(request.POST or None)
        print(request.POST)
        if form.is_valid():
            instance = form.save(commit=False)
            instance.user = request.user
            instance.save()
            return redirect('addreddit/add') 

    context = {
        "title": title,
        "user": request.user,  # not available if you haven't submitted the form
        "form": form
        }
return render(request, "addreddit/add.html", context)

【问题讨论】:

    标签: django forms models


    【解决方案1】:

    即使请求方法不是 POST,您也在该视图中做了很多工作来保存表单数据。在这种情况下,当您发出 GET 请求时,将保存一个表单实例,其中仅填充了 .user 字段。您也没有验证表单,这是一个有用的 Django 内置功能。试试这个:

    def add(request):
        title = 'Add Reddit Account'
    
        if request.method == 'POST':
            form = AddRedditForm(request.POST)
            if form.is_valid():
                instance = form.save(commit=False)
                instance.user = request.user
                instance.save()
                return redirect('addreddit/add')  # or whatever named URL this is
        else:
            form = AddRedditForm()
    
        context = {
            "form": form,
            "title": title,
            "user": instance.user  # not available if you haven't submitted the form
        }
        return render(request, "addreddit/add.html", context)
    

    在 GET 请求中,instance.user 将给出名称错误。我想它只是为了调试。否则,您仍然可以访问request.user

    我建议的另一个修改是 POST 之后的重定向,这样刷新页面就不会意外地重新提交表单。通过导入得到这个:

    from django.shortcuts import redirect
    

    【讨论】:

    • 异常值:赋值前引用的局部变量'form' - addreddit/views.py in add,第 21 行 - 由于 if 语句,表单在逻辑之前不存在并且不能传递给模型。
    • 嗯。在我的 if-else 语句的两个子句中,form 被分配给。您是否完全改变了上述建议?
    • 上面哪一行对应你的第21行?
    • 上下文字典中的位:"form": form,
    • 能否将更新后的视图函数附加到问题的末尾,以便我看到它的格式?
    【解决方案2】:

    ModelForm 不需要您重新定义字段。我会重写你的 forms.py 来反映这个事实。

    class AddRedditForm(forms.ModelForm):
        class Meta:
            model = Account
            fields = ['user_name','password','secret','tag']
    

    【讨论】:

      猜你喜欢
      • 2020-06-27
      • 2017-06-13
      • 2012-11-29
      • 1970-01-01
      • 2016-09-26
      • 1970-01-01
      • 1970-01-01
      • 2017-07-27
      • 2019-05-26
      相关资源
      最近更新 更多