Настройка автоматического заполнения некоторых полей с помощью CreateVeiw в Django

#django #django-forms

#django #django-forms

Вопрос:

Я использую CreateView Django для заполнения формы, и я хочу, чтобы некоторые поля заполнялись автоматически, ища ides, как я мог это сделать. поля, которые я хочу заполнить автоматически, — это company, recruiter и date

вот как выглядит файл 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)
 

Комментарии:

1. Можете ли вы поделиться своей моделью, представлением и полями, которые вы хотите автоматически заполнить? Установлены ли некоторые из них a default=... в модели?

2. Да, я только что поделился своим кодом, в основном поля, которые я хочу заполнить автоматически, — это рекрутер, компания и дата

3. Я предполагаю user , что это зарегистрированный пользователь. Но как вы определяете компанию? Содержит ли URL-адрес первичный ключ компании, например?

4. Да, пользователь является зарегистрированным пользователем. Компания — это поле внешнего ключа, которое есть у рекрутера.

Ответ №1:

Что-то подобное должно работать просто отлично :

  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

Ответ №2:

Автоматически присваивать значение

Мы можем присвоить значение, не отображая его в форме. В этом случае вы удаляете поля 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()
        } 

Комментарии:

1. Вы уверены, что я могу удалить их из полей? Я пробовал это, но теперь они полностью исчезли из формы

2. @Ben123123: первый вариант присваивает значение без поля формы, второй предоставляет значение по умолчанию для формы.