Установка некоторых полей для автоматического заполнения с помощью CreateVeiw в Django
Я использую Django's CreateView для заполнения формы и хочу, чтобы некоторые поля заполнялись автоматически, ищу идеи, как я могу это сделать. поля, которые я хочу заполнять автоматически: компания, рекрутер и дата
вот как выглядит файл views:
class CreateNewJobForm(CreateView):
model = Job
fields = (
'title', 'company', 'recruiter', 'job_type', 'work_from', 'description', 'city', 'address', 'title_keywords',
'date_created')
template_name = 'create_new_job_form.html'
success_url = '/job_created_successfully'
def form_valid(self, form):
form.instance.recruiter = self.get_name()
return super(CreateNewJobForm, self).form_valid(form)
и вот как выглядит файл моделей:
class Recruiter(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, primary_key=True)
name = models.CharField(max_length=255)
company = models.ForeignKey(Company, on_delete=models.RESTRICT, related_name='recruiters')
email = models.EmailField(max_length=255)
phone_number = models.CharField(max_length=15, blank=True)
Автоматическое присвоение значения
Мы можем присвоить значение, не показывая его в форме. В этом случае вы удалите поля company
, recruiter
и date_created
из fields
, и заполните их в методе form_valid
:
from django.contrib.auth.mixins import LoginRequiredMixin
class CreateNewJobForm(LoginRequiredMixin, CreateView):
model = Job
fields = ('title', 'job_type', 'work_from', 'description', 'city', 'address', 'title_keywords')
template_name = 'create_new_job_form.html'
success_url = '/job_created_successfully'
def form_valid(self, form):
recruiter = form.instance.recruiter = self.request.user.recruiter
form.instance.company_id = recruiter.company_id
return super().form_valid(form)
для date_created
, вы можете работать с auto_now_add=True
параметром [Django-doc] из DateTimeField
:
class Job(models.Model):
# …
date_created = models.DateTimeField(auto_now_add=True)
Предоставить начальное значение
Мы также можем предоставить начальное значение для формы, переопределив метод .get_initial()
[Django-doc]:
from django.contrib.auth.mixins import LoginRequiredMixin
from django.utils.timezone import now
class CreateNewJobForm(LoginRequiredMixin, CreateView):
model = Job
fields = ('title', 'job_type', 'work_from', 'description', 'city', 'address', 'title_keywords', 'company', 'recruiter', 'date_created')
template_name = 'create_new_job_form.html'
success_url = '/job_created_successfully'
def get_initial(self):
recruiter = self.request.user.recruiter
return {
'recruiter': recruiter,
'company': recruiter.company,
'date_created': now()
}
Что-то вроде этого должно работать просто отлично :
def form_valid(self, form):
form.instance.user = self.request.user # assuming you want the current login user to be set to the user
return super(CreateNewJobForm, self).form_valid(form)
Это просто пример, но вкратце вы можете получить доступ к атрибутам вашей модели, обратившись к экземпляру вашей формы следующим образом form.instance.yourfield