我对Django和网络开发相对较新。我试图建立一个包含两类用户,客户和供应商的网站。我需要能够在网站上向这两类客户展示不同的东西。例如,供应商标题部分中的不同链接。
我认为最好的方法是在我的/ admin中创建两个用户组('供应商''客户'),创建两个不同的注册表单(一个供应商,一个供客户使用),并在注册表单提交时将每个发送给各自的用户组。从那里我可以根据用户组决定用户看到了什么。正确的吗?
不幸的是,我几乎以我的智慧结束了!我创建了用户组,创建了不同的注册表单,但在过去的两天里,我一直试图找出如何将注册信息发送到各自的组,我无法设法做到了!我已经搜索过高低,并尝试了我能找到的每一段建议代码:没有运气。
我尝试过的大部分内容都是按照以下方式进行的:
views.py
from __future__ import unicode_literals
from django.contrib.auth import (
authenticate,
get_user_model,
login,
logout,
)
from django.contrib.auth.models import User, Group
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import redirect, render, get_object_or_404
from .forms import SupplierRegisterForm
def supplier_signup_view(request):
form = SupplierRegisterForm(request.POST or None)
if form.is_valid():
user = form.save(commit=False)
user.groups.add(Group.objects.get(name='suppliers'))
password = form.cleaned_data.get('password')
user.set_password(password)
user.save()
new_user = authenticate(username=user.username, password=password)
login(request, new_user)
if next:
return redirect(next)
return redirect("/")
context = {
"form": form,
"title": title,
}
return render (request, "supplier_signup.html", context)
forms.py
from django import forms
from django.contrib.auth import (
authenticate,
get_user_model,
login,
logout,
)
from django.contrib.auth.models import User, Group
User = get_user_model()
class SupplierRegisterForm(forms.ModelForm):
username = forms.CharField()
email = forms.EmailField(label="Email Address")
email2 = forms.EmailField(label="Confirm Email", widget=forms.TextInput(attrs={'autocomplete':'false'}))
password = forms.CharField(widget=forms.PasswordInput)
class Meta:
model = User
fields = [
'username',
'email',
'email2',
'password',
]
def clean_email2(self):
email = self.cleaned_data.get('email')
email2 = self.cleaned_data.get('email2')
if email != email2:
raise forms.ValidationError("Emails must match")
email_qs = User.objects.filter(email=email)
if email_qs.exists():
raise forms.ValidationError("This email has already been registered")
return email
如果有人能给我一个初学者的演练,我将非常感谢如何在表单提交时自动将用户发送给用户组。请包括我需要使用的所有代码,无论是在settings,urls.py,models.py,forms.py,views.py还是模板(包括导入等),以及我需要执行的任何命令以及何时(例如迁移)。
非常感谢!
答案 0 :(得分:0)
编辑:我已经改变了使用Django API的答案。
在PlaterTest <- structure(list(Wells = c("A01", "A02", "A03"), `Amino acid position` =
c("D46",
"blank", "blank"), Mutant = c("A", "Y", "R"), Fluorescence = c(456L,
856L, 356L)), .Names = c("Wells", "Amino acid position", "Mutant",
"Fluorescence"), row.names = c("1", "2", "3"), class = c("tbl_df",
"tbl", "data.frame"))
之后致电user.save_m2m()
:
user.save()
解释(来自Django docs):
如果您的模型具有多对多关系,并且在保存表单时指定
if form.is_valid(): ... user.save() user.save_m2m() ...
,则Django无法立即保存多对多关系的表单数据。这是因为在实例存在于数据库中之前,无法为实例保存多对多数据。要解决此问题,每次使用
commit=False
保存表单时,Django都会向commit=False
子类添加save_m2m()
方法。在您手动保存表单生成的实例后,您可以调用ModelForm
来保存多对多表单数据。