Администратор автоматически заполняет поле пользователя из запроса - PullRequest
1 голос
/ 12 августа 2011

Я создал форму администратора django, чтобы добавить новое поле в модель и обновить общую модель, мой код приведен ниже. Все работает прекрасно, чтобы принять текущего зарегистрированного пользователя. В методе save () я не могу получить доступ к request.user для заполнения поля creation_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

Ответы [ 2 ]

3 голосов
/ 12 августа 2011

Исходя из ответа @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)
3 голосов
/ 12 августа 2011

Чтобы получить доступ к запросу в админке, вам необходимо переопределить метод save_model вашего ModelAdmin:

Пример:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...