Python 在将选择值保存到django之前,默认情况下将其传递给表单
因此,您可以让用户在激活django管理面板中的is_人员后创建新服务,以获得其用户帐户,然后他将成为分销商 这是服务和分销商的链接模型: models.pyPython 在将选择值保存到django之前,默认情况下将其传递给表单,python,django,django-models,django-forms,django-views,Python,Django,Django Models,Django Forms,Django Views,因此,您可以让用户在激活django管理面板中的is_人员后创建新服务,以获得其用户帐户,然后他将成为分销商 这是服务和分销商的链接模型: models.py class Distributor(models.Model): user = models.OneToOneField(User,on_delete=models.CASCADE,null=True, blank=True) service_ch =[('credit','credit'),('games','games')] name
class Distributor(models.Model):
user = models.OneToOneField(User,on_delete=models.CASCADE,null=True, blank=True)
service_ch =[('credit','credit'),('games','games')]
name = models.CharField(max_length=200,null=True,blank=False)
phone = PhoneNumberField(null=True,blank=False)
address = models.CharField(max_length=200,null=True,blank=False)
facebook = models.CharField(max_length=200,null=True,blank=False)
ccp = models.BigIntegerField(null=True,blank=False)
key = models.IntegerField(null=True,blank=False)
def __str__(self):
return self.name
class Service(models.Model):
type_ch = [('credit','credit'),('game','game')]
currency_ch = [('€','€'),('$','$'),('DZD','DZD'),('Unit','Unit')]
distributor = models.ForeignKey(Distributor,on_delete=models.SET_NULL,null=True,blank=False)
model = models.CharField(choices=type_ch,max_length=20,null=True,blank=False)
name = models.CharField(max_length=200,null=True,blank=False)
price = models.FloatField(default=0.00)
currency = models.CharField(choices=currency_ch,max_length=20,null=True,blank=False)
available = models.FloatField(null=True,blank=False)
image = models.ImageField(default='defser.png')
def __str__(self):
return self.name
如果我手动选择分发服务器,用于创建新服务的ServiceForm可以正常工作
forms.py
class ServiceForm(forms.ModelForm):
class Meta():
model = Service
fields = ['distributor','model','name','price','currency','available','image']
def __init__(self, *args, **kwargs):
super(ServiceForm, self).__init__(*args, **kwargs)
self.fields['model'].widget.attrs['class'] = 'form-control-account'
self.fields['name'].widget.attrs['class'] = 'form-control-account'
self.fields['distributor'].widget.attrs['class'] = 'form-control-account'
self.fields['price'].widget.attrs['class'] = 'form-control-account'
self.fields['currency'].widget.attrs['class'] = 'form-control-account'
self.fields['available'].widget.attrs['class'] = 'form-control-account'
views.py
def service_create(request):
user = request.user
if user.is_staff:
if request.method == "POST":
form = ServiceForm(request.POST, request.FILES)
if form.is_valid():
form.save()
messages.success(request,'Service has been added successfully.')
return HttpResponseRedirect(reverse('saller'))
else:
raise PermissionDenied()
form = ServiceForm()
return render(request, 'app/service_form.html', {'form': form})
问题是具有分发服务器权限的用户不能选择分发服务器,
因为现在他可以使用其他分销商的名称创建服务,所以他所要做的就是选择另一个分销商的名称,该名称作为一个选择列表显示数据库中的所有分销商名称!!
如何防止这种情况发生,并使表单在默认情况下选择当前登录分发服务器作为新创建服务的分发服务器????
是否有这样的事情或方法解决此问题?如果用户必须登录:
from django.contrib.auth.decorators import login_required
@login_required
def service_create(request):
user = request.user
if request.method == "POST":
if user.is_staff:
form = ServiceForm(request.POST, request.FILES)
if form.is_valid():
db = form.save(commit=False)
db.name = request.user
db.save()
messages.success(request,'Service has been added successfully.')
return HttpResponseRedirect(reverse('saller'))
else:
error = form.errors.as_data()
return render(request, 'app/service_form.html', {'form': form, 'error':error,})
else:
raise PermissionDenied()
else:
form = ServiceForm()
return render(request, 'app/service_form.html', {'form': form})
Form.py:
您可以从字段中删除“name”您好,我认为这篇文章应该会对您有所帮助:您可以将用户传递到表单
\uuuuu init\uuuuu
方法,并过滤可用的选项,因此不会显示其他可能性,验证将验证是否遵守此约束用户必须登录才能查看查看页面。在这种情况下,您将拥有用户名:request.user。而表单中不应显示“名称”字段,您将用用户名填写它