ApP*_*PeL 4 django django-forms
我的模型用户可以创建步枪,这种步枪显然与用户有关.
class Gun(ImageModel):
user = models.ForeignKey(User)
...
...
...
Run Code Online (Sandbox Code Playgroud)
我有另一个依赖于此的模型并且需要使用用户步枪,但是当用户添加记录时我只想显示他的步枪.
mt模型如下所示
class Trophies(ImageModel):
used_his = models.ForeignKey(Gun)
Run Code Online (Sandbox Code Playgroud)
我的表格如下
from django.forms import ModelForm
from django import forms
from models import Trophies
from gunsafe.models import Gun
from django.contrib.auth.models import User
class TrophiesForm(request.user, ModelForm):
used_his = forms.ModelMultipleChoiceField(queryset=Gun.objects.filter(user__id=1))
def __init__(self, user, *args, **kwargs):
super(TrophiesForm, self).__init__(*args, **kwargs)
self.fields['used_his'].queryset = User.objects.filter(pk = user)
Run Code Online (Sandbox Code Playgroud)
我想知道如何获取当前登录的用户ID而不是 user__id=1
这是观点.
def edit(request, trophy_id, template_name='trophies/edit.html'):
trophy = Trophies.objects.get(pk=trophy_id)
if request.method == 'POST':
form = TrophiesForm(request.POST, request.FILES, instance=trophy)
if form.is_valid():
newform = form.save(commit=False)
newform.user = request.user
newform.save()
...
...
Run Code Online (Sandbox Code Playgroud)
Man*_*dan 10
我认为你可以通过覆盖__init__()表单的方法,传递一个实例User并过滤queryset使用该用户来实现这一点.像这样的东西:
class TrophiesForm(ModelForm):
used_his = forms.ModelMultipleChoiceField(queryset=Gun.objects.filter(user__id=1))
def __init__(self, user, *args, **kwargs):
super(TrophiesForm, self).__init__(*args, **kwargs)
self.fields['used_his'].queryset = User.objects.filter(pk = user.id)
Run Code Online (Sandbox Code Playgroud)
在您的视图中,您可以传入适当的(当前登录的)实例User.
def my_trophies(request, *args, **kwargs):
user = request.user
form = TrophiesForm(user)
...
Run Code Online (Sandbox Code Playgroud)
Manoj顺从的另一个角度...
使用kwarg传递用户数据,以免打乱方法签名,因为它希望将request.POST作为第一个参数。更好的约定如下。
class TrophiesForm(ModelForm):
def __init__(self, *args, **kwargs):
#using kwargs
user = kwargs.pop('user', None)
super(TrophiesForm, self).__init__(*args, **kwargs)
self.fields['used_his'].queryset = User.objects.filter(pk = user.id)
Run Code Online (Sandbox Code Playgroud)
现在在通话中,这更加明确,并遵循更好的签名约定
form = TrophiesForm(request.POST, request.FILES, user=request.user)
Run Code Online (Sandbox Code Playgroud)
您还可以使用instance:(在获取实例obj之前注意超级)
class TrophiesForm(ModelForm):
def __init__(self, *args, **kwargs):
super(SubmissionUploadForm, self).__init__(*args, **kwargs)
user = self.instance.user
self.fields['used_his'].queryset = User.objects.filter(pk = user.id)
Run Code Online (Sandbox Code Playgroud)
然后,您可以像这样调用您的views.py:
form = TrophiesForm(instance=*MyModel*(user=request.user))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14693 次 |
| 最近记录: |