使用基于django类的视图创建两个模型之间的关系

问题描述:

我有两个模型公司和Campaign。我需要在他们之间建立一种关系。我认为我的模型很好。使用基于django类的视图创建两个模型之间的关系

公司/ model.py

class Company(models.Model): 

    class Meta: 
     verbose_name_plural = "companies" 

    user = models.ForeignKey(settings.AUTH_USER_MODEL) 
    title = models.CharField(blank=False, max_length=128, default='') 
    slug = models.SlugField(blank=True, unique=True) 
    archived = models.BooleanField(default=False) 
    timestamp = models.DateTimeField(auto_now_add=True, auto_now=False) 

活动/ models.py

class Campaign(models.Model): 

    class Meta: 
     verbose_name_plural = "campaigns" 

    company = models.ForeignKey('companies.Company', on_delete=models.CASCADE,) 
    title = models.CharField(blank=False, max_length=128, default='') 
    slug = models.UUIDField(default=uuid.uuid4, blank=True, editable=False) 

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

活动/ forms.py

class CampaignForm(forms.ModelForm): 
    class Meta: 
     model = Campaign 
     fields = ['title','description','archived'] 

活动/ views.py

class CampaignCreateView(SubmitBtnMixin, CreateView): 
    model = Campaign 
    company = None 
    form_class = CampaignForm 
    submit_btn = "Add Campaign" 
    template_name = "form.html" 

活动/ urls.py

url(r'^campaign/create/$', CampaignCreateView.as_view(), name='campaign-create'), 

我的问题是,创建一个新的活动,在哪里以及如何做我拿起公司PK的时候填充Campaign模型?做这件事最安全和最好的做法是什么?

我找到了一个解决方案,但仍希望获得有关最佳实践的意见。

我将此添加到我的CampaignCreateView

def form_valid(self, form): 
    company = get_object_or_404(Company, id=self.kwargs.get('pk'), user_id=self.request.user.id) 
    form.instance.company_id = company.id 
    return super(CampaignCreateView, self).form_valid(form) 

,我改变了我的网址:

url(r'^campaign/(?P<pk>\d+)/create/$', CampaignCreateView.as_view()... 

不知道,我喜欢在URL的PK,因为它可以抬高。这就是为什么我要在公司模型中过滤用户标识以确保数据来自所有者。

我想通过在会议ID中注册公司来做到这一点,但我不相信会议不会出现他们自己的问题。