我想使用Django管理界面来创建一个非常简单的Web应用程序,但我无法解决一个不应该难以解决的问题.
考虑以下:
class Contact(models.Model):
name = models.CharField(max_length=250, blank=False)
created_by = models.ForeignKey(User, blank=False)
Run Code Online (Sandbox Code Playgroud)
我找不到自动填充created_by字段并让Django管理员知道它的方法.我见过的大多数方法都意味着重载了Object的save方法并将其传递给请求用户.它们都需要构建自定义视图和/或表单.
最好在管理站点中创建新联系人的表单不应显示created_by字段(这很容易)并使用当前用户自动填充它(这似乎比它应该更难).
我需要在添加视图中设置正在创建帖子的用户:
@login_required
def add(request):
if request.method == 'POST':
form = BusinessForm(request.POST)
form.user_id = request.user.id
if form.is_valid():
form.save()
return HttpResponseRedirect(reverse('listing.views.detail'), args=(f.id))
else:
form = BusinessForm()
return render_to_response('business/add.html', {'form':form},
context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)
我分配了用户ID,form.user_id = request.user.id但在保存时,它仍然给我一个错误Column user_id cannot be null
难道我做错了什么?谢谢
编辑:
我从模型中的表单中排除用户:
class BusinessForm(ModelForm):
class Meta:
model = Business
exclude = ('user',)
Run Code Online (Sandbox Code Playgroud)
这会导致问题吗?我该如何解决这个问题?
编辑2:
按照建议编辑了我的BusinessForm()类但没有工作:
class BusinessForm(ModelForm):
class Meta:
model = Business
exclude = ('user',)
def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request', None)
return super(BusinessForm, self).__init__(*args, **kwargs)
def save(self, *args, **kwargs): …Run Code Online (Sandbox Code Playgroud) 我试图ModelForm从这里构建一个解决方案,但是我收到此错误:
'User' object has no attribute 'get'
Run Code Online (Sandbox Code Playgroud)
这个想法是构建ModelForm一个表单,提交时登录的用户会更新条目。
models.py 是:
class UserDetailsForm(ModelForm):
class Meta:
model = UserProfile
fields = ['mobile_phone']
def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request', None)
return super(UserDetailsForm, self).__init__(*args, **kwargs)
def save(self, *args, **kwargs):
kwargs['commit']=False
obj = super(UserDetailsForm, self)
if self.request:
obj.user = UserProfile.objects.get(user=self.request.user)
obj.save()
Run Code Online (Sandbox Code Playgroud)
我在 models.py 中的模型是
class UserProfile(models.Model):
user = models.OneToOneField(User)
mobile_phone = models.CharField(max_length=30,help_text='Max 30 characters.',blank=True)
#have shortened this for simplicity
def __unicode__(self):
return self.mobile_phone
Run Code Online (Sandbox Code Playgroud)
根据这里的请求,我们从views.py 中回溯了问题:
userprofile …Run Code Online (Sandbox Code Playgroud) 我的问题与这个问题非常相似: Django:保存模型时填充用户ID
不幸的是,我不太明白他们的答案.
当用户登录时,我希望他们能够提交链接,并且我有一个user_id外键,我似乎无法填充.
def submit(request):
if request.method == 'POST':
form = AddLink(request.POST)
if form.is_valid():
form.save()
return redirect('home')
else:
form = AddLink()
return render_to_response('links/submit.html', {'form': form})
Run Code Online (Sandbox Code Playgroud)
我每次提交表格时都会提到:
null value in column "user_id" violates not-null constraint
Run Code Online (Sandbox Code Playgroud)
我理解但我不知道如何将user_id添加到我的表单对象.如何访问当前登录用户的ID并将其与表单数据一起提交?
我有中间件的问题我发现了很多关于它的问题,但在我的情况下没有任何帮助.
我使用中间件来获取current_user以在我的模型中使用以在save方法中保存修改后的用户,而无需在视图中写入此内容.
这是原始帖子,代码如下:
中间件
from threading import local
_user = local()
class CurrentUserMiddleware(object):
def process_request(self, request):
_user.value = request.user
def get_current_user():
return _user.value
Run Code Online (Sandbox Code Playgroud)
这段代码有问题,因为我收到的错误如下:
Traceback (most recent call last):
File "C:\Program Files (x86)\Python35-32\Lib\wsgiref\handlers.py", line 137, in run
self.result = application(self.environ, self.start_response)
File "C:\Users\loc\dJangoEnvironment\lib\site-packages\django\contrib\staticfiles\handlers.py", line 63, in __call__
return self.application(environ, start_response)
File "C:\Users\loc\dJangoEnvironment\lib\site-packages\django\core\handlers\wsgi.py", line 158, in __call__
self.load_middleware()
File "C:\Users\loc\dJangoEnvironment\lib\site-packages\django\core\handlers\base.py", line 53, in load_middleware
mw_instance = mw_class()
TypeError: 'module' object is not callable
[20/Jul/2016 10:51:44] "GET /panel/ HTTP/1.1" 500 …Run Code Online (Sandbox Code Playgroud)