auth选择在forms.py中选择

时间:2017-04-09 14:18:56

标签: python django django-forms

我已在此question中阅读此代码并且看起来不错。 但如果我有用户身份验证,我希望用户只选择你的odjects如何更改该代码?为ex选择你的个人上传图像。

from django.forms.widgets import Select
    class ProvinceForm(ModelForm):
        class Meta:
            CHOICES = Province.objects.all()

            model = Province
            fields = ('name',)
            widgets = {
                'name': Select(choices=( (x.id, x.name) for x in CHOICES )),
            }

我的模特:

class MyModel(models.Model):
    user = models.ForeignKey(User, unique=True)
    upload = models.ImageField(upload_to='images')

1 个答案:

答案 0 :(得分:1)

每当您在视图中实例化表单时,都应该传递user对象,例如my_form = MyModelForm(user=request.user)

然后构建您的MyModelForm

# forms.py

from django.forms import ModelForm
from django.forms.widgets import Select

class MyModelForm(ModelForm):
    def __init__(self, *args, **kwargs):
        # extract "user" value from kwrags (passed through form init). If there's no "user" keyword, just set self.user to an empty string.
        self.user = kwargs.pop('user', '')
        super(MyModelForm, self).__init__(*args, **kwargs)
        if self.user:
            # generate the choices as (value, display). Display is the one that'll be shown to user, value is the one that'll be sent upon submitting (the "value" attribute of <option>)
            choices = MyModel.objects.filter(user=self.user).values_list('id', 'upload')
            self.fields['upload'].widget = Select(choices=choices)

    class Meta:
        model = MyModel
        fields = ('upload',)

现在,每当您使用user关键字参数(my_form = MyModelForm(user=request.user))实例化表单时,此表单将呈现为这样(在您的模板中将其写为{{ my_form }}):

<select>
    <option value="the_id_of_the_MyModel_model">upload_name</option>
    <option value="the_id_of_the_MyModel_model">upload_name</option>
    ...
</select>

最后,为了在下拉菜单中显示图像(记住,&#34;值&#34;是在提交表单时将被发送回服务器的那个,而显示一个仅用于UX),拿a look here

[更新]:如何在views.py

中执行此操作
# views.py

def my_view(request):
    my_form = MyModelForm(user=request.user)
    if request.method == 'POST':
        my_form = MyModelForm(request.POST, user=request.user)
        if my_form.is_valid():
            # ['upload'] should be the name of the <select> here, i.e if <select name="whatever"> then this should be "whatever"
            pk = my_form.cleaned_data['upload']
            # image, now, is the value of the option selected (that is, the id of the object)
            obj = MyModel.objects.get(id=pk)
            print(obj.upload.url)  # this should print the image's path
    return render(request, 'path/to/template.html', {'my_form': my_form})