2016-02-11 68 views
0

我试图从基于类的视图调用外部api。 目前我有下面哪个调用API的视图。然而目前我只是用api(username, password)调用API,它返回数据但不保存。django从视图调用外部api

我该如何将视图中modelform中使用的模型传递给api函数,以便它可以将返回的数据保存到相关用户。 (即我需要在CBV中重写什么方法)。

另外什么是在Django中调用外部API的最佳方法(从表单完成启动)。目前,API往返时间需要5-10秒,目前它的设置方式会延迟下一页加载量。

class SupplierOnlineAccountView(CreateView): 
    form_class = SupplierOnlineAccountForm 
    template_name = 'standard_form.html' 
    success_url = '../contacting' 

    def form_valid(self, form): 
     username = form.cleaned_data.get('username') 
     password = form.cleaned_data.get('password') 
     api(username, password) 
     return super().form_valid(form) 

型号:

class EUser(models.Model): 
    username = models.CharField(max_length=255, null=True) 
    password = models.CharField(max_length=255, null=True) 
    address = models.ForeignKey(Address, null=True) 
    temp_user = models.CharField(max_length=255, null=True) 
    user = models.OneToOneField(settings.AUTH_USER_MODEL, null=True, default=None) 
    title = models.CharField(max_length=10) 
    first_name = models.CharField(max_length=255) 
    last_name = models.CharField(max_length=255) 
+0

你能详细说明你到底想做什么:你得到的数据,你想要保存的数据 –

+0

当然,谢谢,我试图将返回的API数据保存在Euser模型中。 SupplierOnlineAccountForm也保存到Euser模型。 Api返回first_name,last_name等...和其他数据以保存在EUser模型中。 – Yunti

+0

好的,更新了一个答案。 –

回答

1
def form_valid(self, form): 
    username = form.cleaned_data.get('username') 
    password = form.cleaned_data.get('password') 
    self.object = form.save() 
    api(username, password,self.object) 
    return super().form_valid(form) 

你将不得不更改标题,名字,姓氏字段为空=真这样你就可以在API调用之前保存,然后通过保存的模型。

API的等待时间问题,这是一个像芹菜队列的典型异步任务。您保存表单,然后将任务卸载到在另一个线程(或进程或计算机)上运行的队列中。然后django不必等到api返回,然后发送响应。

+0

谢谢,我现在在ModelFormMixin中看到。有没有一种方法不是先保存,而是仍然传递要保存的对象,比如'instance = form.save(commit = False)'在基于函数的视图中?我宁愿避免在api将保存的所有字段中填入blank = True,因为最终可能会有很多。 – Yunti

+0

你可以,但最好先保存到db,尤其是在它进入外部API之前。 –

+0

只是为了理解为什么在去api之前先保存更好? – Yunti