【问题标题】:Setting some fields to be automatically filled in using CreateVeiw in Django在 Django 中使用 CreateVeiw 设置一些字段自动填写
【发布时间】:2021-12-11 13:31:02
【问题描述】:

我正在使用 Django 的 CreateView 来填写表格,并且我希望自动填写一些字段,并寻找我如何做到这一点的想法。我想自动填写的字段是公司、招聘人员和日期

这就是视图文件的样子:

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)

【问题讨论】:

  • 您能分享您的模型、视图和您自动要填写的字段吗?其中一些是由模型中的default=... 设置的吗?
  • 是的,我刚刚分享了我的代码,基本上我想自动填写的字段是招聘人员、公司和日期
  • 我假设user 是登录用户。但是如何确定公司? URL是否包含例如公司的主键?
  • 是的,用户是登录用户。公司是招聘人员拥有的外键字段。

标签: django django-forms


【解决方案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】:

    自动赋值

    我们可以分配一个值而不在表单中显示它。在这种情况下,您从fields 中删除companyrecruiterdate_created 字段,并在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,您可以使用DateTimeFieldauto_now_add=True parameter [Django-doc]

    class Job(models.Model):
        # …
        date_created = models.DateTimeField(auto_now_add=True)

    提供一个初始值

    我们还可以通过覆盖.get_initial() method [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()
            }

    【讨论】:

    • 您确定我可以将它们从字段中删除吗?我试过了,但现在它们完全从表单中消失了
    • @Ben123123:第一个变体分配一个没有表单字段的值,第二个为表单提供默认值。
    猜你喜欢
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多