【问题标题】:admin auto populate user field from request管理员从请求中自动填充用户字段
【发布时间】:2011-08-11 23:54:37
【问题描述】:

我已经制作了一个 django 管理表单来向模型添加一个新字段并更新一个通用模型,我的代码如下。它所有的工作都完美地接受了保存当前登录的用户。在 save() 方法中,我无法访问 request.user 来填充 created_by 字段。

class EventAdminForm(forms.ModelForm):
    tag_it   = forms.CharField(max_length=100)

    class Meta:
        model = Event

    # Step 2: Override the constructor to manually set the form's latitude and
    # longitude fields if a Location instance is passed into the form
    def __init__(self,  *args, **kwargs):
        super(EventAdminForm, self).__init__(*args, **kwargs)

        # Set the form fields based on the model object
        if kwargs.has_key('instance'):
            instance = kwargs['instance']
            self.initial['tag_it'] = ', '.join([i.slug for i in instance.tags.all()])



    def set_request(self, request):
        self.request = request
    # Step 3: Override the save method to manually set the model's latitude and
    # longitude properties based on what was submitted from the form
    def save(self, commit=True):
        model = super(EventAdminForm, self).save(commit=False)

        for i in self.cleaned_data['tag_it'].split(','):
            model.tags.create(slug=i, created_by=User.objects.get(username='mazban'))


        if commit:
            model.save()

        return model

class EventForm(admin.ModelAdmin):
    exclude = ('published_by', 'published_at', 'updated_at', 'updated_by', )
    form = EventAdminForm

【问题讨论】:

    标签: django


    【解决方案1】:

    从@brandon 的回复和您的评论中获取,您可以将它们混合使用:

    # admin.py
    
    # don't override EventAdminForm's save(). Instead implement it here:         
    
    class EventAdmin(admin.ModelAdmin):
        exclude = ('published_by', 'published_at', 'updated_at', 'updated_by', )
        form = EventAdminForm
    
        def save_model(self, request, obj, form, change):
            obj.save()
            obj.tags.all().delete()
            for i in form.cleaned_data['tag_it'].split(','):
                obj.tags.create(slug=i, created_by=request.user)
    

    【讨论】:

      【解决方案2】:

      要在 admin 中访问请求,您需要覆盖 ModelAdmin 的 save_model 方法:

      例子:

      def save_model(self, request, obj, form, change):
          if not change:
              obj.author = request.user
          obj.save()
      

      有关更多信息,请查看文档:https://docs.djangoproject.com/en/1.3/ref/contrib/admin/#modeladmin-methods

      【讨论】:

      • 在我上面的代码中,我试图创建一个需要用户 ID 的通用关系字段。在 ModelAdmin 中重写代码会相当困难,是否可以将请求传递给 EventFormAdmin?
      • 嗯。我不确定在 Django amdin 中将请求传递给 ModelAdmin 表单的方法。在 admin 之外很容易做到,但我还没有在 admin 内部完成这个用例。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-25
      • 2017-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多