У меня есть форма, определенная в моем 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>