Я сталкиваюсь со следующим сценарием: у меня есть класс модели Django с именем Contact
, который выглядит примерно так:
class Contact(models.Model):
first_name = models.CharField(max_length=70)
last_name = models.CharField(max_length=70)
company = models.ForeignKey(Company) // should be disabled in user-facing forms
organizations = models.ManyToManyField(Organization) // should be disabled and hidden in user-facing forms
// some other fields not relevant to this question
Как пользователи приложения, так и администраторы должны иметь возможность создавать объекты типа Contact
и сохранять их в базе данных. Однако для пользователя это должно быть ограничено таким образом, чтобы он не мог свободно выбирать поле компании для объекта Contact
. Для этого я создал базу ModelForm
с именем ContactForm
, предназначенную для администраторов, и ограниченный пользовательский дочерний класс под названием RestrictedContactForm
. Код выглядит следующим образом:
class ContactForm(forms.modelForm):
class Meta:
model = Contact
fields = ['first_name', 'last_name', 'company', 'organizations']
class RestrictedContactForm(ContactForm):
class Meta(ContactForm.Meta):
widgets = {'organizations': forms.HiddenInput()}
def __init__(self, *args, **kwargs):
super(RestrictedContactForm, self).__init__(*args, **kwargs)
// Maybe populate company and organization here somehow?
self.fields['company'].disabled = True
self.fields['organization'].disabled = True
RestrictedContactForm
отображается пользователю, когда он решает создать новый контакт. Очевидно, что оба поля company
и organization
являются обязательными, их необходимо каким-то образом вводить вручную. Именно в этом и заключается моя проблема: Мне не удалось заполнить эти поля вручную.
Ниже вы можете найти схему функции представления, реализующей логику создания, инициированного пользователем.
def create_contact(request, company_pk):
company = Company.objects.get(pk=company_pk)
organization = Organization.objects.get(...)
if request.method == 'POST':
// Add company.pk and organization.pk to POST here?
// Pass data dictionary manually populated from POST and
// with company.pl and organization.pk to constructor?
contact_form = RestrictedContactForm(request.POST, request.FILES)
// Add company.pk and organization.pk to contact_form.data
// here (after making it mutable)?
if contact_form.is_valid():
contact_form.save()
return redirect(...)
return render(...)
contact_form = ContactForm(initial={'company': company, 'organizations': organization})
Я уже попробовал каждое предложение, появляющееся в комментариях выше. Форма просто никогда не проверяет. Мой вопрос, следовательно, заключается в том, что будет правильным способом сделать это? Кроме того, правильно ли изложен подход, по крайней мере, концептуально?
В проекте используется Django 1.9.