问题描述
我需要以某种方式将用户信息从资源类传递给 ForeignKeyWidget
类,在其中创建ForeignKey对象:
class CompanyWidget(ForeignKeyWidget):
def clean(self,value,row=None,*args,**kwargs):
print(self.user,file=sys.stderr)
if not value:
return None
else:
obj,_ = Company.objects.get_or_create(
name=value,created_by='I NEED USER informatION HERE SOMEHOW',)
return obj
做到这一点的最佳方法是什么?
我试图自己解决这个问题,并且非常接近,但无法解决难题的最后一部分。您可以覆盖资源中的__init__
类,并在那里获取用户信息。然后,我不知道如何将这些self.user
信息传递给类变量company
。
代码如下:
class ContactResource(resources.ModelResource):
def __init__(self,**kwargs):
self.user = kwargs.pop('user',None)
super(ContactResource,self).__init__(*args,**kwargs)
company = fields.Field(
column_name='company',attribute='company',widget=CompanyWidget(model=Company,field='name',user='I NEED TO PASS USER HERE FROM __init__'))
def after_import_instance(self,instance,new,**kwargs):
instance.created_by = kwargs['user']
如果我设法以某种方式在**kwargs
变量的company
中传递用户信息,那么我可以通过覆盖 ForeignKeyWidget 的__init__
类来在下游使用它:
class CompanyWidget(ForeignKeyWidget):
def __init__(self,model,field='pk',**kwargs):
self.model = model
self.field = field
self.user = kwargs.pop('user',None)
super(CompanyWidget,self).__init__(model,**kwargs)
def clean(self,created_by=self.user,)
return obj
任何帮助将不胜感激,我花了很长时间才来到这里,我觉得我真的很近。预先谢谢你。
解决方法
事实证明,完全不需要使用ForeignKeyWidget即可轻松实现此目的。 如果您有多个并非唯一但具有相同名称的外键(在我的情况下,是由不同用户创建的相同公司名称),这是解决问题的方法:
Class ContactResource(resources.ModelResource):
<body>
<div class="header">
<h1>Kevs Hotel</h1>
<input type="search" id="locationSearch" name="location" placeholder="Location" onkeyup="searchBarFeatures()">
<input type="date" class="checkInTime" name="checkInDate" placeholder="Check in" required>
<input type="date" class="checkOutTime" name="checkOutDate" placeholder="Check out">
<input type="number" class="noOfGuests" name="NoOfGuests" placeholder="Guests">
<input type="submit" class="submitBtn" value="Search">
</div>
<ul id="hotelList">
</ul>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>