繁体   English   中英

在将选择值保存到 django 之前,默认将选择值传递给表单

[英]pass a choice value by default to a form before saving it in django

所以这个想法是,您可以让用户在 django 管理面板中为其用户帐户激活 is_staff 后创建新服务,然后他将成为分销商这是服务和分销商的链接模型:

模型.py

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'

视图.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:您可以从字段中删除“名称”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM