Я не могу отобразить django полей формы в зависимости от типа пользователя или типа доступа в моем шаблоне - PullRequest
0 голосов
/ 01 мая 2020

У меня есть форма, определенная в моем forms.py, в моей форме есть это поле, называемое «пользователь», которое является моим внешним ключом или ссылкой на мою модель пользователя. Я хочу, чтобы это поле отображалось, если вы «администратор CDA», тогда это поле не должно отображаться, если вы «член CDA». «Администратор CDA» и «Член CDA» - это способы определения типа пользователя. Я знаю, что могу достичь той же цели, создав другую форму, просмотры, ссылки на URL и т. Д. c и создав шаблоны. Я не хочу go через этот процесс, я хочу легко управлять им в одном месте.

Как мне справиться с этим в моем forms.py, если это возможно, представления и шаблоны? Пожалуйста, мне действительно понадобится кто-то, кто поможет мне с примерами кода. Ниже приведено то, что я сделал до сих пор

options.py

CDA_EXECUTIVE = 'CDA Executive'
CDA_MEMBER = 'CDA Member'
CMO = 'CMO'
CDA_ADMIN = 'CDA Admin'
CHOOSE = ''
USER_TYPE = [
    (CDA_EXECUTIVE, 'CDA Executive'),
    (CDA_MEMBER, 'CDA Member'),
    (CHOOSE, 'Choose User Type'),
    (CMO, 'CMO'),
    (CDA_ADMIN, 'CDA Admin'),
]

моделей. py

from __future__ import unicode_literals
from django.db import models
from django.contrib.auth.models import PermissionsMixin
from django.contrib.auth.base_user import AbstractBaseUser
from django.utils.translation import ugettext_lazy as _

class User(AbstractBaseUser, PermissionsMixin):
    member_id = models.CharField(_('Member Id'), max_length=14, unique=True)
    email = models.EmailField(_('Email Address'))
    phone1 = models.CharField(_('Phone Number 1'), max_length=16)
    phone2 = models.CharField(_('Phone Number 2'), max_length=16, blank=True)
    first_name = models.CharField(_('First name'), max_length=30, blank=True)
    last_name = models.CharField(_('Last name'), max_length=30, blank=True)
    date_joined = models.DateTimeField(_('Date joined'), auto_now_add=True)
    is_active = models.BooleanField(_('active'), default=True)
    lcda = models.ForeignKey(LCDA, on_delete=models.SET_NULL, null=True)
    zone = models.ForeignKey(ZonalID, on_delete=models.SET_NULL, null=True)
    area = models.ForeignKey(AreaID, on_delete=models.SET_NULL, null=True)
    user_type = models.CharField(max_length=30, choices=options.USER_TYPE, default=options.CHOOSE)

    objects = UserManager()

    USERNAME_FIELD = 'member_id'
    REQUIRED_FIELDS = []

    class Meta:
        verbose_name = _('myuser')
        verbose_name_plural = _('myuser')

models.py

class DuesLevy(models.Model):
    class_of_dues = models.CharField(max_length=30, default=options.CHOOSE, choices=options.CLASS_OF_DUES, blank=True)
    payment_circle = models.CharField(max_length=30, default=options.CHOOSE, choices=options.PAYMENT_CIRCLE)
    payment_option = models.CharField(max_length=30, default=options.CHOOSE, choices=options.PAYMENT_OPTION)
    amount = models.DecimalField(max_digits=8, decimal_places=2)
    payment_date = models.DateField()
    date_recorded = models.DateTimeField(auto_now_add=True)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    description = models.TextField(blank=True, null=True)

    def __str__(self):
        return self.amount


    def get_absolute_url(self):
        return reverse('backend:detail_dues', kwargs={'pk': self.id})

forms.py

class DuesForm(forms.ModelForm):
    class_of_dues = forms.CharField(required=False, widget=forms.Select(choices=options.CLASS_OF_DUES, attrs={'class':'form-control'}))
    payment_circle = forms.CharField(required=False, widget=forms.Select(choices=options.PAYMENT_CIRCLE, attrs={'class':'form-control'}))
    payment_option = forms.CharField(required=False, widget=forms.Select(choices=options.PAYMENT_OPTION, attrs={'class':'form-control'}))
    amount = forms.DecimalField(widget=forms.NumberInput(attrs={'class':'form-control'}))
    payment_date = forms.DateField(widget=forms.DateInput(attrs={'class':'form-control', 'type':'date'}))

    user = forms.ModelChoiceField(
        queryset=User.objects.all(),
        label=u"Member*",
        empty_label='Select User',
    #This 's2forms.ModelSelect2Widget' is just a package I installed in my app 
        widget=s2forms.ModelSelect2Widget(
            attrs={'class':'form-control'},
            model=User,
            search_fields=['member_id__icontains'],
        )
    )
    description = forms.CharField(widget=forms.Textarea(attrs={'class':'form-control'}))


    class Meta():
        model = DuesLevy
        exclude = ('date_recorded', )

views.py

class AddMemberDues(LoginRequiredMixin, CreateView):
    login_url = '/backoffice/'
    model = DuesLevy
    template_name =  'dashboard/add-edit-member-dues.html'
    form_class = DuesForm

    def form_valid(self, form):
        form.instance.user = self.request.user
        return super().form_valid(form)

на моей базе. html

 {% if user.is_authenticated and user.user_type == 'CDA Admin' %}
            {% include 'dashboard/admin-sidebar.html' %}

 {% elif user.is_authenticated and user.user_type == 'CDA Member' %}
       {% include 'dashboard/member-sidebar.html' %}

 {% endif %}

в форме двух колонок. html

 {% if messages %}
    {% for mess in messages %}
    <div class="alert alert-success">{{ mess }}</div>
    {% endfor %}
    {% endif %}
    {{ form.non_field_errors }}
    {% for hidden_field in form.hidden_fields %}
        <p class="text-danger">{{ hidden_field.errors }}</p>
        {{ hidden_field }}
    {% endfor %}

        <div class="form-row">
        {% for my_field in form.visible_fields %}
        <!-- THIS IS FOR ERROR IN THE FORM -->
          {% if my_field.errors %}
              {% for err in my_field.errors %}
              <p class="text-danger">{{ err }}</p>
              {% endfor %}
          {% endif %}
         <!-- THIS IS FOR THE FIELDS -->
            <div class="form-group col-sm-6">
                {{ my_field.label_tag }}
                {{ my_field }}
                {% if my_field.help_text %}
                <span class="help-block">{{ my_field.help_text }}</span>
                {% endif %}
            </div>

          <!-- END THE FIELDS -->
      {% endfor %}
    </div>

      {% csrf_token %}

сборы за редактирование. html

<form method="POST">
        {% include 'dashboard/two-column-form.html' with form=form %}
        {% if not form.instance.pk %}
          <input type="submit" class="btn btn-primary" value="Add Dues">
        {% else %}
          <input type="submit" class="btn btn-primary" value="Edit Dues">
        {% endif %}

      </form>
...