将提交表单的用户存储到同一个table?
Store the user who submitted the form into the same table?
我正在寻找最明智的方法来存储负责提交表单的用户的姓名,这样我就可以轻松地按用户名组织他们提交的表单,有点像 "account setting"每个用户。
我已经搜索过,但解决方案非常零散,所有关于此的帖子都引用旧版本以及每个 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)
ModelForm
不需要您重新定义字段。我会重写您的 forms.py 以反映这一事实。
class AddRedditForm(forms.ModelForm):
class Meta:
model = Account
fields = ['user_name','password','secret','tag']
即使请求方法不是 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
会报name错误。我认为它只是用于调试。否则,您仍然可以访问 request.user
.
我建议的另一个修改是 POST 之后的重定向,这样刷新页面就不会意外地重新提交表单。通过导入获取:
from django.shortcuts import redirect
我正在寻找最明智的方法来存储负责提交表单的用户的姓名,这样我就可以轻松地按用户名组织他们提交的表单,有点像 "account setting"每个用户。
我已经搜索过,但解决方案非常零散,所有关于此的帖子都引用旧版本以及每个 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)
ModelForm
不需要您重新定义字段。我会重写您的 forms.py 以反映这一事实。
class AddRedditForm(forms.ModelForm):
class Meta:
model = Account
fields = ['user_name','password','secret','tag']
即使请求方法不是 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
会报name错误。我认为它只是用于调试。否则,您仍然可以访问 request.user
.
我建议的另一个修改是 POST 之后的重定向,这样刷新页面就不会意外地重新提交表单。通过导入获取:
from django.shortcuts import redirect