2017-08-10 96 views
1

我目前正在研究一个允许用户为关键字设置同义词的Django应用程序。 它使用下面的模型:Django:从视图更新对象,没有模型或模板

class UserSynonym(models.Model): 
    user = models.ForeignKey(Tenant) 
    key = models.CharField(max_length=255) 
    value = models.CharField(max_length=255) 

一个ListView为用户提供的概述,并且每个条目后面是“编辑”按钮链接到相关 EditView中,允许用户改变“值”参数。

我现在想要添加一个按钮,允许用户快速将对象重置为其原始含义(将'value'设置为'key'的值) 我希望这是一个按钮,没有任何表单或html模板。只需按下列表上的按钮,即可“重置”模型的值。

我认为我必须为此任务编辑一个EditView,但是,这些视图保持不变,我为它们提供了一个表单或一个HTML模板/页面 这不是我想要做的。

有没有办法改变EditView,使它改变对象的值,而不用将用户重定向到表单或新的网页?

编辑: 为了完整起见,我为我目前使用它

class SynonymUpdate(UserRootedMixin, UpdateView): 
    model = UserSynonym 
    form_class = SynonymCreateForm 

    def get_form_kwargs(self): 
     kwargs = super(SynonymUpdate, self).get_form_kwargs() 
     kwargs['user'] = self.request.user 
     return kwargs 

    def form_valid(self, form): 
     form.instance.linked_user = self.kwargs.get('user') 
     return super(SynonymUpdate, self).form_valid(form) 

    def get_success_url(self, **kwargs): 
     return reverse('synonym_list', args=[self.request.user.id]) 

回答

1

我有点解决我的问题已经加入的UpdateView。我放弃了使用基于类的视图,并使用以下函数:

def SynonymReset(request, user_id, pk): 
    """(re)sets the Synonym.value to the value of Synonym.key""" 

    #Get relevant variables 
    currentuser = User.objects.get(id=request.user.id) 
    currentsynonym = Synonym.objects.get(id = pk) 

    #(re)set object & save 
    currentsynonym.value = currentsynonym.key 
    currentsynonym.save() 

    #Return to the listview. 
    return redirect('synonym_list', user=current_user) 

这样的值复位,无需进入单独的网页。我仍然希望有一天能够在基于课堂的观点中找到如何做到这一点。但现在这已经足够了。

+1

这里绝对没有要查询用户的要点。 'currentuser'与* request.user'完全相同的db对象;你应该通过这个。 –