Django表单集当前用户
与之相关,但在此基础上扩展-我如何在表单集中使用此技术 我想在表单中使用当前登录的用户,但我正在表单集中使用该表单。单个表单的参考解决方案是在init中将request.user传递给表单和流程。如何为表单集中的每个表单添加kwargs 我的代码中的示例: 在forms.py中Django表单集当前用户,django,django-forms,django-views,Django,Django Forms,Django Views,与之相关,但在此基础上扩展-我如何在表单集中使用此技术 我想在表单中使用当前登录的用户,但我正在表单集中使用该表单。单个表单的参考解决方案是在init中将request.user传递给表单和流程。如何为表单集中的每个表单添加kwargs 我的代码中的示例: 在forms.py中 class NewStudentForm (forms.Form): username = forms.RegexField(label=_("Username"), max_length=30, regex=r
class NewStudentForm (forms.Form):
username = forms.RegexField(label=_("Username"), max_length=30, regex=r'^\w+$',
help_text = _("Required. 30 characters or fewer. Alphanumeric characters only (letters, digits and underscores)."),
error_message = _("This value must contain only letters, numbers and underscores."))
first_name = forms.CharField(label=_('first name'), max_length=30 )
last_name = forms.CharField(label=_('last name'), max_length=30, )
email = forms.EmailField(label=_('e-mail address') )
password = forms.CharField(label=_('password'), max_length=64, )
class Meta:
model = User
fields = ("username","first_name", "last_name", "email", "password")
def __init__(self, *args, **kwargs):
self._user = kwargs.pop('user')
super(NewStudentForm, self).__init__(*args, **kwargs)
def save(self, commit=True):
user = super(NewStudentForm, self).save(commit=False)
user.set_password(self.cleaned_data["password"])
if commit:
user.save()
profile = Profile.objects.create_profile(user)
profile.activiation_key = profile.ACTIVATED_KEY
profile.authorized = True
profile.save()
user.is_active=True
user.save()
student = models.Student()
student.user = user
student.teacher = self._user
student.plaintext_pwd = self.cleaned_data["password"]
student.save()
return UserWarning
然后在views.py中
@login_required
def new_student(request):
from django.forms.formsets import formset_factory
try:
if request.method == 'GET':
newStudentFormset = formset_factory(forms.NewStudentForm, extra=2)
formset = newStudentFormset()
return shortcuts.render_to_response('NewStudent.html', { 'newStudentFormSet':formset, 'active_username': request.user.username })
elif request.method == 'POST':
if LOGIN_FORM_KEY in request.POST:
return _handle_login(request)
data = request.POST.copy()
newStudentFormset = formset_factory(forms.NewStudentForm)
formset = newStudentFormset(data) ### Pass current user to formset? ###
if formset.is_valid():
formset.save()
request.user.message_set.create(message="Save successful.")
return shortcuts.redirect(student)
else:
return shortcuts.render_to_response('NewStudent.html', { 'newStudentFormSet':formset, 'active_username': request.user.username, 'error_message':formset.errors})
return http.HttpResponseNotAllowed(['GET', 'POST'])
except models.Student.DoesNotExist:
return http.HttpResponseNotFound('<h1>Requested Student not found</h1>')
@需要登录\u
def新生(请求):
从django.forms.formsets导入formset_工厂
尝试:
如果request.method==“GET”:
newStudentFormset=formset\u工厂(forms.NewStudentForm,extra=2)
formset=newStudentFormset()
返回快捷方式。render_to_响应('NewStudent.html',{'newStudentFormSet':formset',active_username':request.user.username})
elif request.method==“POST”:
如果登录\表单\输入request.POST:
返回\u句柄\u登录(请求)
data=request.POST.copy()
newStudentFormset=formset\u工厂(forms.NewStudentForm)
formset=newStudentFormset(数据)###是否将当前用户传递给formset###
如果formset.is_有效():
formset.save()
request.user.message\u set.create(message=“保存成功”)
返回快捷方式。重定向(学生)
其他:
返回快捷方式.render_to_response('NewStudent.html',{'newStudentFormSet':formset,'active_username':request.user.username,'error_message':formset.errors})
返回http.HttpResponseNotAllowed(['GET','POST'])
除models.Student.DoesNotExist外:
返回http.HttpResponseNotFound('未找到请求的学生')
这里有一个关于将表单参数传递给表单集的类似问题:
就个人而言,我喜欢关于在函数中动态构建表单类的第二个答案,因为它实现起来非常快,而且易于理解。通过添加扩展
BaseFormSet
的类,您可以添加自定义代码以向表单传递参数
在forms.py
中:
class NewStudentFormSet(BaseFormSet):
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user', None)
super(NewStudentFormSet, self).__init__(*args, **kwargs)
def _construct_forms(self):
self.forms = []
for i in xrange(self.total_form_count()):
self.forms.append(self._construct_form(i, user=self.user))
# ...
data = request.POST.copy()
newStudentFormset = formset_factory(forms.NewStudentForm, formset=forms.NewStudentFormSet)
formset = newStudentFormset(data, user=request.user)
# ...
然后在views.py
中:
class NewStudentFormSet(BaseFormSet):
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user', None)
super(NewStudentFormSet, self).__init__(*args, **kwargs)
def _construct_forms(self):
self.forms = []
for i in xrange(self.total_form_count()):
self.forms.append(self._construct_form(i, user=self.user))
# ...
data = request.POST.copy()
newStudentFormset = formset_factory(forms.NewStudentForm, formset=forms.NewStudentFormSet)
formset = newStudentFormset(data, user=request.user)
# ...
多亏了。我宁愿直接在视图中迭代表单:
for form in formset.forms:
form.user = request.user
formset.save()
- 它可以避免创建不必要的BaseFormSet
- 它更干净
if formset.is_valid():
new_instances = formset.save(commit=False)
for new_instance in new_instances:
new_instance.user = request.user
new_instance.save()
我尝试了自相似的解决方案,但在Django 1.6中,
BaseFormSet
不起作用
我遵循了中的步骤:我的工作方式是:
class NewStudentFormSet(BaseFormSet):
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user',None)
super(NewStudentFormSet, self).__init__(*args, **kwargs)
for form in self.forms:
form.empty_permitted = False
def _construct_forms(self):
if hasattr(self,"_forms"):
return self._forms
self._forms = []
for i in xrange(self.total_form_count()):
self._forms.append(self._construct_form(i, user=self.user))
return self._forms
forms = property(_construct_forms)
formset.save()是否应该是循环的一部分?还是应该改为form.save()