【问题标题】:How to load an instance in class based views using form_valid如何使用 form_valid 在基于类的视图中加载实例
【发布时间】:2020-01-11 21:51:19
【问题描述】:

我正在尝试构建一个表单,该表单自动填充基于类的创建视图中的某些字段,该视图允许登录用户创建作业。但是,对于不是用户的字段(例如 request.user),我似乎找不到正确的方法。

所以创建视图试图从登录用户那里获取公司名称,公司名称字段属于名为公司的模型。每个公司都有一个拥有用户模型外键的所有者。到目前为止,我尝试过的所有请求都导致了“WSGIRequest”错误。

到目前为止,我已尝试请求: 公司名称 user.company_name company.company_name 公司 用户

我不明白这些请求是如何工作的,我已经看到了获取登录用户名的示例,但我不熟悉如何执行此操作。

请有人帮我理解这是如何工作的以及我应该如何做?

我正在使用 Django 2.2 和 python 3.6

验证模型:

class User(AbstractBaseUser, PermissionsMixin):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    phone_number = models.CharField(max_length=15)
    email = models.EmailField(max_length=250, unique=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    last_login = models.DateTimeField(null=True, blank=True)
    date_joined = models.DateTimeField(auto_now_add=True)
    objects = UserManager()

    USERNAME_FIELD = 'email'
    EMAIL_FIELD = 'email'

    def __str__(self):
        return self.first_name

    def get_absolute_url(self):
        return "/users/%i/" % self.pk


class Company(models.Model):
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    company_name = models.CharField(max_length=100, unique=True)
    company_address = models.CharField(max_length=100, unique=True)
    company_website = models.URLField(blank=True, null=True)
    company_verified = models.BooleanField(default=False)

    def __str__(self):
        return self.company_name

查看

class JobCreateView(LoginRequiredMixin, CreateView):
    model = Job
    form_class = JobForm
    template_name = 'jobs/job_create.html'

def form_valid(self, form):
    form.instance.company_name = self.request.user
    form.instance.job_reference = self.request.job.pk
    return super(JobCreateView, self).form_valid(form)

def get_success_url(self):
    return reverse('jobs:job_details', kwargs={'pk': self.object.pk})

其他型号:

class Job(models.Model):
JOB_TYPE = (
    ('1', 'Service'),
    ('2', 'Repair'),
    ('3', 'Quotation'),
    ('4', 'Consultation'),
    ('5', 'Report'),
    ('6', 'Design'),
)

ACCOUNT_TYPE = (
    ('1', 'Existing Customer'),
    ('2', 'Charge to Account'),
    ('3', 'New Customer'),
    ('4', 'Pre-Paid/C.O.D'),
    ('5', 'Issued and Acc App'),
)

company_name = models.ForeignKey(Company, related_name='jobs', verbose_name="Company Name", on_delete=models.CASCADE)
job_reference = models.CharField(max_length=50, blank=False)
contact_person = models.CharField(max_length=50)
contact_number = models.IntegerField()
contact_person_email = models.EmailField(max_length=100, blank=True, null=True)
site_address = models.CharField(max_length=100)
job_type = models.CharField(choices=JOB_TYPE, max_length=50, default='1')
account_type = models.CharField(choices=ACCOUNT_TYPE, max_length=50, default='1')
job_details = models.CharField(max_length=1000)
created = models.DateTimeField(default=now, blank=True)

def __str__(self):
    return str(self.company_name)

def get_absolute_url(self):
    return reverse('jobs:detail', kwargs={'pk': self.pk})

【问题讨论】:

  • "创建视图试图从登录的用户那里获取一个 company_name,company_name 字段属于一个名为 Company 的模型"。您的用户模型中没有 company_name 字段,那么您想如何访问它?您可以定义公司(-ies)外键字段并尝试从相关对象访问公司名称。
  • 目标是消除用户输入公司名称的需要。所以它只是为用户处理。我认为模型中的相关对象在这种情况下并没有真正的帮助,因为它通常用于查询集。

标签: django django-forms django-2.2


【解决方案1】:

对于任何试图解决此类问题的人来说,答案是:

观看次数:

class JobDocketCreate(CreateView):
    model = JobDocket
    form_class = JobDocketForm
    template_name = 'jobs/job_docket_create.html'

def form_valid(self, form):
    form.instance.technician = self.request.user
    form.instance.job = Job.objects.get(pk=self.kwargs['job_pk'])
    print(form.instance.job)
    print(form.instance.technician)
    context = {'job_pk':self.kwargs['job_pk']}
    return super(JobDocketCreate, self).form_valid(form)

def get_context_data(self, **kwargs):
    context = super(JobDocketCreate, self).get_context_data(**kwargs)
    context['job_pk'] = self.kwargs['job_pk']
    return context

def get_success_url(self):
    return reverse('jobs:my_job_dockets')

视图中的表单操作:

action="{% url 'jobs:create_job_docket' job_pk %}"

【讨论】:

    猜你喜欢
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 2023-01-27
    相关资源
    最近更新 更多