Найти - Пользователи
Полная версия: Работа со скрытыми полями django-admin
Начало » Django » Работа со скрытыми полями django-admin
1 2
delfenes
Привет, всем!

Столкнулась со следующей проблемой: в админке джанго не получается отобразить скрытые поля формы.
Суть: на сайте есть форма, в которой содержится информации о сданном задании. В скрытое поле формы записывается дата и время сдачи задания. В админке администратор сайта должен иметь возможность просмотреть сданное задание и время его отправки.

Есть модель задания:
class PassTheTask(models.Model):
    name = models.ForeignKey(Task)
    text = models.TextField(u'Описание')
    time = models.DateTimeField(u'Дата и время сдачи задания', auto_now_add=True, null=True, blank=True)
Форма:
class PassForm(forms.ModelForm):
    class Meta:
        model = PassTheTask
        widgets = {'time': forms.HiddenInput()}
        fields = ['name', 'text', 'link']
вьюшка:
def passthetask(request):
    if request.method == 'POST':
        form = PassForm(request.POST)
        if form.is_valid():
            name = form.cleaned_data['name']
            text = form.cleaned_data['text']
            link = form.cleaned_data['link']
            messages.add_message(request, messages.INFO, 'Задание отправлено.')
            form.save()
        return render(request, 'game/task.html', {'form': form})
    else:
        form = PassForm()
    return render(request, 'game/task.html', {'form': form})
Сама форма в html:
	<form method="post" enctype="multipart/form-data" action="">
			{% csrf_token %}
		{{form.as_p}}
            <input type="hidden" name="time">
		<input type="submit" value="Сдать задание" />
		</form>

Админка:
class PassTheTaskForm(forms.ModelForm):
    STATUS_CHOICES = (
        ('WAIT', u'Ожидает проверки'),
        ('PASS', u'Сдано успешно'),
        ('VIEWED', u'Сдано не успешно')
    )
    status = forms.ChoiceField(choices=STATUS_CHOICES)
class PassTheTaskAdmin(ModelAdmin):
    fields = ('name', 'text'', 'status', 'time')
    list_display = ('name', 'status',)
admin.site.register(PassTheTask, PassTheTaskAdmin)

Когда time присутствует в filelds возникает ошибка: Unknown field(s) (time) specified for PassTheTask. Check fields/fieldsets/exclude attributes of class PassTheTaskAdmin.
Причем time может спокойно присутствовать в list_display и выводиться.

Я так понимаю, есть какая фишка с редактированием скрытых полей в админке. Или может есть другой способ передавать время заполнения формы?
FishHook
А где Мета у PassTheTaskForm? Там должна быть указана модель и филды.
delfenes
Или может есть другой способ передавать время заполнения формы?
Зачем это надо то? Что серверная сторона сама не определит, когда в неё реквест свалился?
delfenes
редактированием скрытых полей
Вы не находите, что это оксюморон?
delfenes
Ок, как вытащить когда реквест свалился?

мне нужно чтобы админ сайта видел, когда задание сдано.
FishHook
delfenes
Ок, как вытащить когда реквест свалился?
datetime.datetime.now()
неочевидно, я так понимаю?
FishHook
delfenes
мне нужно чтобы админ сайта видел, когда задание сдано
Так покажите ему, нахера делать поле скрытым, а потом спрашивать “как показать скрытое поле”.
Ответ очевиден: не скрывайте его!
delfenes
FishHook
Нет, не очевидно))))
datetime.datetime.now() выводит текущее время СЕЙЧАС! А мне нужно время создания записи ВПОЛНЕ КОНКРЕТНОЙ )))))) Чего я не поняла в вашем предложении?

Хорошо, предположим я не скрою это поле. Но зафиг пользователю инфа о времени создания записи?
Еще раз: у меня задания НА САЙТЕ отправляют ПОЛЬЗОВАТЕЛИ, а проверяет АДМИН в АДМИНКЕ!

Предлагайте другой способ. Я выше более подробно описала что мне нужно. Напишите, как правильно. Научите меня! Я с удовольствием послушаю ваше мнение, как нужно делать правильно!
FishHook
delfenes
delfenes
А мне нужно время создания записи ВПОЛНЕ КОНКРЕТНОЙ
Встречный вопрос, на кой хрен у тебя в модели написано это
time = models.DateTimeField(u'Дата и время сдачи задания', auto_now_add=True, null=True, blank=True)
ну есть ведь у тебя уже auto_now_add. Наверное (я не знаю, у тебя видимо другая логика), фреймворк перед тем как создать запись в БД поместит в соответсвующее поле текущую дату и время, которые и будут датой и временем создания.
delfenes
Хорошо, предположим я не скрою это поле. Но зафиг пользователю инфа о времени создания записи?
Какому пользователю? Зачем ты показываешь админу и пользователю одинаковые формы?
Админу показывай, пользователю не показывай. Это разные формы! У админа своя, у пользователя своя. Или у тебя пользователь доступ в админку имеет?
delfenes
Так у меня с датой все норм. Она сохраняется! С моделью проблем нет.

Проблема посмотреть ее в админке админу. Почему я пользователям админку не показываю. Тут все норм. ЭЭЭ внимательно читай первый пост. Формы не одинаковые!

Для админки я беру данные из модели одной и основе нее же модели я строю форму (поля для формы). А как по-другому, если мне нужно именно эту модель заполнить?
У меня есть модель, на основе ее полей форма, которая показывается юзеру для заполнения задания. В админке из формы для админки PassTheTaskForm показывается данные введенные пользователем.

Добавила мета класс.

class PassTheTaskForm(forms.ModelForm):
    STATUS_CHOICES = (
        ('WAIT', u'Ожидает проверки'),
        ('PASS', u'Сдано успешно'),
        ('VIEWED', u'Сдано не успешно')
    )
    status = forms.ChoiceField(choices=STATUS_CHOICES)
    class Meta:
        model = PassTheTask
	exclude = ['',]
        fileds = ['name', 'text', 'link', 'status', 'time']
class PassTheTaskAdmin(ModelAdmin):
    form = PassTheTaskForm  
    fields = ('name', 'text', 'link', 'status', 'time') вот когда тут есть time ругается
    list_display = ('name', 'status', 'time') а когда тут нормально показывает!
admin.site.register(PassTheTask, PassTheTaskAdmin)

Тогда такой вопрос, а не потому ли оно ругается что поле time не объявлено в PassTheTaskForm? Хотя это же обычное поле модели. Не могу понять почему возникает ошибка: Unknown field(s) (time) specified for PassTheTask. Check fields/fieldsets/exclude attributes of class PassTheTaskAdmin. Почему не известное поле? Уже указала, что никого я не исключаю. exclude = И вот что для меня странно:
Ругается когда я указываю это поле в филдах типа такого поля и нет вовсе для этой моделе. а list_filed показывает!
Я делаю вывод что-то я не понимаю как показывать в админке автозаполняемые поля или в чем проблема?
FishHook
delfenes
В админке из формы для админки PassTheTaskForm показывается данные введенные пользователем.

Покажи мне, где в втоём коде для админки ты используешь PassTheTaskForm

class PassTheTask(models.Model):
    name = models.ForeignKey(Task)
    text = models.TextField(u'Описание')
    time = models.DateTimeField(u'Дата и время сдачи задания', auto_now_add=True, null=True, blank=True)
.......
.......
class PassTheTaskAdmin(ModelAdmin):
    fields = ('name', 'text'', 'status', 'time')
    list_display = ('name', 'status',)
admin.site.register(PassTheTask, PassTheTaskAdmin)
delfenes
ЭЭЭЭ ты чего! в верхнем посте написано:

Админка:
class PassTheTaskForm(forms.ModelForm):
    STATUS_CHOICES = (
        ('WAIT', u'Ожидает проверки'),
        ('PASS', u'Сдано успешно'),
        ('VIEWED', u'Сдано не успешно')
    )
    status = forms.ChoiceField(choices=STATUS_CHOICES)
class PassTheTaskAdmin(ModelAdmin):
    fields = ('name', 'text'', 'status', 'time')
    list_display = ('name', 'status',)
admin.site.register(PassTheTask, PassTheTaskAdmin)

Это к файлу admins.py

А постом выше писала, позже еще дописала вот что:

class PassTheTaskAdmin(ModelAdmin):
    form = PassTheTaskForm 

Тут и использую!
Полный код файла admins.py

# -*- coding: utf-8 -*-
from django.contrib import admin
from django.contrib.admin import ModelAdmin
from .models import *
from django import forms
# Register your models here.
#class Task(ModelAdmin):
admin.site.register(Task)
class PassTheTaskForm(forms.ModelForm):
    STATUS_CHOICES = (
        ('WAIT', u'Ожидает проверки'),
        ('PASS', u'Сдано успешно'),
        ('VIEWED', u'Сдано не успешно')
    )
    status = forms.ChoiceField(choices=STATUS_CHOICES)
    class Meta:
        model = PassTheTask
	exclude = ['',]
        fileds = ['name', 'text', 'link', 'status', 'time']
class PassTheTaskAdmin(ModelAdmin):
    form = PassTheTaskForm  
    fields = ('name', 'text', 'link', 'status', 'time')
    list_display = ('name', 'status', 'time')
admin.site.register(PassTheTask, PassTheTaskAdmin)

А то, что ты привел это куски какие-то из разных файлов вообще: class PassTheTask(models.Model) - это из models.py а это действительно из админки class PassTheTaskAdmin(ModelAdmin). Но там же я писала еще.

эхэхэхэ чото я больше тебе свой код объясняю, чем какую-то посильную помощь получаю…толи у тебя особо нет времени вникать в проблему, чтобы помочь мне, то ли я не понимаю о чем ты мне пытаешься сказать… в итоге пустая какая-то трата времени… И откуда у тебя такая репутация?!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB