очистил article от лишнего кода

remotes/origin/HEAD
Slava Kyrachevsky 9 years ago
parent a41865f9ed
commit e75c406714
  1. 113
      apps/article/admin.py
  2. 171
      apps/article/forms.py
  3. 55
      apps/article/models.py
  4. 186
      templates/c_admin/article/article_add.html
  5. 69
      templates/c_admin/article/article_all.html
  6. 93
      templates/c_admin/article/blog_form.html

@ -14,7 +14,7 @@ from ckeditor.widgets import CKEditorWidget
from sorl.thumbnail.admin.current import AdminImageWidget from sorl.thumbnail.admin.current import AdminImageWidget
#models and forms #models and forms
from .forms import ArticleForm, ArticleDeleteForm, NewsForm from .forms import NewsForm
from .models import Article, Author from .models import Article, Author
from theme.models import Tag from theme.models import Tag
@ -48,101 +48,6 @@ class ArticleDeleteView(DeleteView):
return "/admin/article/%s/all/" % type return "/admin/article/%s/all/" % type
def article_all(request):
"""
Return list of all articles with pagination
"""
return objects_list(request, Article, 'article_all.html')
@login_required
def article_copy(request, url):
article = Article.objects.safe_get(slug=url)
if not article:
return HttpResponseRedirect(get_referer(request))
else:
article.clone()
return HttpResponseRedirect(get_referer(request))
def article_add(request):
"""
Return form of article and post it on the server.
If form is posted redirect on the page of all articles.
"""
#get organiser from current user
init_data = {'author':request.user.organiser}
#choices field which will be filled by ajax
choices = {'tag': Tag}
return add_object_with_file(request, ArticleForm, 'article_add.html', '/admin/article/all',
choices, init_data)
def article_delete(request, url):
return delete_object(request, Article, ArticleDeleteForm, url, '/admin/article/all')
@login_required
def article_change(request, url):
"""
Return form and fill it with existing Article object data.
If form is posted redirect on the page of all articles.
"""
try:
#check if article_id exists else redirect to the list of cities
article = Article.objects.get(slug=url)
file_form = FileModelForm(initial={'model': 'article.Article'})
article_id = getattr(article, 'id')
except:
return HttpResponseRedirect('/admin/article/all')
if request.POST:
form = ArticleForm(request.POST)
#set choices filled by ajax
form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()]
if form.is_valid():
form.save(getattr(article, 'id'))
return HttpResponseRedirect('/admin/article/all')
else:
data = {}
#fill form with data from database
data['author'] = article.author
data['theme'] = [item.id for item in article.theme.all()]
data['tag'] = [item.id for item in article.tag.all()]
#hidden field
data['article_id'] = article_id
#data from translated fields
for code, name in settings.LANGUAGES:
obj = Article._meta.translations_model.objects.get(language_code = code,master__id=getattr(article, 'id')) #access to translated fields
data['main_title_%s' % code] = obj.main_title
data['preview_%s' % code] = obj.preview
data['description_%s' % code] = obj.description
data['title_%s' % code] = obj.title
data['keywords_%s' % code] = obj.keywords
data['descriptions_%s' % code] = obj.descriptions
#fill form
form = ArticleForm(initial=data)
#set choices filled by ajax
form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.filter(theme__in=data['theme'])]
args = {}
args.update(csrf(request))
args['form'] = form
args['languages'] = settings.LANGUAGES
args['file_form'] = file_form
#get list of files which connected with specific model object
args['files'] = FileModel.objects.filter(content_type=ContentType.objects.get_for_model(article), object_id=getattr(article, 'id'))
args['obj_id'] = getattr(article, 'id')
return render_to_response('article_add.html', args)
#----------------------- #-----------------------
from django.views.generic import FormView from django.views.generic import FormView
from functions.custom_views import ListView from functions.custom_views import ListView
@ -231,7 +136,7 @@ class BlogView(FormView):
class NewsList(ListView): class NewsList(ListView):
model = Article model = Article
template_name = 'article/article_admin_list.html' template_name = 'c_admin/article/article_admin_list.html'
paginate_by = 20 paginate_by = 20
def get_queryset(self): def get_queryset(self):
@ -248,17 +153,3 @@ class NewsView(BlogView):
template_name = 'c_admin/article/blog_form.html' template_name = 'c_admin/article/blog_form.html'
success_url = '/admin/article/news/all/' success_url = '/admin/article/news/all/'
obj = None obj = None
"""
from django.views.generic import CreateView
from models import Blog
from forms import BlogForm
class BlogCreate(CreateView):
model = Blog
form_class = BlogForm
template_name = 'c_admin/blog/blog_add.html'
"""

@ -97,26 +97,6 @@ class _BlogForm(forms.Form):
return [] return []
class BlogForm(_BlogForm):
author = forms.ModelChoiceField(label=_(u'Автор'), queryset=Author.objects.all())
draft = forms.BooleanField(label=_(u'Черновик'), required=False, localize=True)
def __init__(self, *args, **kwargs):
super(BlogForm, self).__init__(*args, **kwargs)
if len(settings.LANGUAGES) in range(10):
for lid, (code, name) in enumerate(settings.LANGUAGES):
# required = True if lid == 0 else False
self.fields['short_description_%s' % code] = forms.CharField(label=_(u'Краткое содержание'), required=False, widget=CKEditorWidget)
def save(self, author, article=None, commit=True):
article = super(BlogForm, self).save(author, article=article, commit=False)
article.draft = self.cleaned_data['draft']
article.author_s = self.cleaned_data['author']
article.save()
return article
class NewsForm(_BlogForm): class NewsForm(_BlogForm):
type = Article.news type = Article.news
exposition = forms.CharField(label=_(u'Выставка'), widget=forms.HiddenInput(), required=False) exposition = forms.CharField(label=_(u'Выставка'), widget=forms.HiddenInput(), required=False)
@ -154,157 +134,6 @@ class NewsForm(_BlogForm):
return None return None
class ArticleForm(forms.Form):
"""
Create Article form for creating conference
__init__ uses for dynamic creates fields
save function saves data in Article object. If it doesnt exist create new object
"""
#users that have organiser profile
author = forms.ModelChoiceField(label=_(u'Автор'),queryset=User.objects.exclude(organiser__isnull=True))
key = forms.CharField(required=False, widget=forms.HiddenInput())
theme = forms.ModelMultipleChoiceField(label=_(u'Тематики'), queryset=Theme.objects.all())
#creates select input with empty choices cause it will be filled with ajax
tag = forms.MultipleChoiceField(label=_(u'Теги'), required=False)
article_id = forms.CharField(required=False, widget=forms.HiddenInput())
def __init__(self, *args, **kwargs):
"""
create dynamical translated fields fields
"""
super(ArticleForm, self).__init__(*args, **kwargs)
#creates translated forms example: name_ru, name_en
# len(10) is a hack for detect if settings.LANGUAGES is not configured it return all langs
if len(settings.LANGUAGES) in range(10):
for lid, (code, name) in enumerate(settings.LANGUAGES):
# uses enumerate for detect iteration number
# first iteration is a default lang so it required fields
required = True if lid == 0 else False
self.fields['main_title_%s' % code] = forms.CharField(label=_(u'Заголовок'), required=required)
self.fields['preview_%s' % code] = forms.CharField(label=_(u'Превью'), required=required, widget=CKEditorWidget)
self.fields['description_%s' % code] = forms.CharField(label=_(u'Описание'), required=required, widget=CKEditorWidget)
#meta data
self.fields['title_%s' % code] = forms.CharField(label=_(u'Тайтл'), required=False, max_length=255,
widget=forms.TextInput(attrs={'style':'width: 550px'}))
self.fields['keywords_%s' % code] = forms.CharField(label=_(u'Дескрипшен'), required=False, max_length=255,
widget=forms.TextInput(attrs={'style':'width: 550px'}))
self.fields['descriptions_%s' % code] = forms.CharField(label=_(u'Кейвордс'), required=False, max_length=255,
widget=forms.TextInput(attrs={'style':'width: 550px'}))
def save(self, id=None):
"""
change Article object with id = id
N/A add new Article object
usage: form.save(obj) - if change article
form.save() - if add article
"""
data = self.cleaned_data
#create new Article object or get exists
if not id:
article = Article()
else:
article = Article.objects.get(id=id)
#clear manytomany relations
article.theme.clear()
article.tag.clear()
if data.get('author'):
article.user = User.objects.get(id=data['author'].id)#.id cause select uses queryset
#create slug field from russian language
if not getattr(article, 'slug'):
article.slug = translit_with_separator(data['main_title_ru'].strip()).lower()
# fill translated fields and save object
fill_with_signal(Article, article, data)
# fill manytomany fields
for item in data['theme']:
article.theme.add(item.id)#.id cause select uses queryset
for item in data['tag']:
article.tag.add(item)
article.save()
#save files
check_tmp_files(article, data['key'])
def clean(self):
id = self.cleaned_data.get('article_id')
main_title_ru = self.cleaned_data.get('main_title_ru')
article = Article.objects.filter(url=translit_with_separator(main_title_ru))
if article and str(article[0].id) != id:
msg = _(u'Статья с таким названием уже существует')
self._errors['main_title_ru'] = ErrorList([msg])
del self.cleaned_data['main_title_ru']
return self.cleaned_data
class ArticleDeleteForm(forms.ModelForm):
url = forms.CharField(widget=forms.HiddenInput())
class Meta:
model = Article
fields = ('url',)
#----------------------------------
"""
from models import Blog
class BlogForm(forms.ModelForm):
class Meta:
model = Blog
exclude = ('created', 'modified', 'creator', 'theme', 'tag')
def __init__(self, *args, **kwargs):
super(BlogForm, self).__init__(*args, **kwargs)
if len(settings.LANGUAGES) in range(10):
for lid, (code, name) in enumerate(settings.LANGUAGES):
# uses enumerate for detect iteration number
# first iteration is a default lang so it required fields
required = True if lid == 0 else False
self.fields['main_title_%s' % code] = forms.CharField(label='Заголовок', required=required)
self.fields['preview_%s' % code] = forms.CharField(label='Превью', required=required, widget=CKEditorWidget)
self.fields['description_%s' % code] = forms.CharField(label='Описание', required=required, widget=CKEditorWidget)
#meta data
self.fields['title_%s' % code] = forms.CharField(label='Тайтл', required=False, max_length=255,
widget=forms.TextInput(attrs={'style':'width: 550px'}))
self.fields['keywords_%s' % code] = forms.CharField(label='Дескрипшен', required=False, max_length=255,
widget=forms.TextInput(attrs={'style':'width: 550px'}))
self.fields['descriptions_%s' % code] = forms.CharField(label='Кейвордс', required=False, max_length=255,
widget=forms.TextInput(attrs={'style':'width: 550px'}))
"""
class ArticleFilterForm(forms.Form):
theme = forms.MultipleChoiceField(label=_(u'Тематика:'), required=False,
choices=[(item.id, item.name) for item in Theme.objects.language().distinct()])
tag = forms.CharField(label=_(u'Теги:'), widget=forms.HiddenInput(), required=False)
'''
def __init__(self, *args, **kwargs):
"""
create dynamical translated fields fields
"""
super(ArticleFilterForm, self).__init__(*args, **kwargs)
ids = [item['theme_id'] for item in list(Article.objects.blogs().values('theme_id').distinct())]
self.fields['theme'] = forms.MultipleChoiceField(label=_(u'Тематика:'), required=False,
choices=[(item.id, item.name) for item in Theme.objects.language().filter(id__in=ids)])
'''
class BlogFilterForm(forms.Form): class BlogFilterForm(forms.Form):
tag = forms.CharField(label=_(u'Теги:'), widget=forms.HiddenInput(), required=False) tag = forms.CharField(label=_(u'Теги:'), widget=forms.HiddenInput(), required=False)

@ -107,21 +107,6 @@ class Article(TranslatableModel):
def __unicode__(self): def __unicode__(self):
return self.lazy_translation_getter('main_title', self.pk) return self.lazy_translation_getter('main_title', self.pk)
def translation_model(self):
return self._meta.translations_model
def publish(self):
"""
set publish date. uses when publish date is none
"""
self.in_sitemap = True
if not self.publish_date:
# save time only first time
self.publish_date = now()
self.save()
return self
def get_event(self): def get_event(self):
""" """
get event connected to article get event connected to article
@ -137,17 +122,8 @@ class Article(TranslatableModel):
# If no slug is provided, generates one before saving. # If no slug is provided, generates one before saving.
if not self.slug: if not self.slug:
self.slug = self.generate_unique_slug() self.slug = self.generate_unique_slug()
# Set the description field on save.
# if self.gen_description:
# self.description = strip_tags(self.description_from_content())
super(Article, self).save(*args, **kwargs) super(Article, self).save(*args, **kwargs)
def description_from_content(self):
"""
"""
# place for logic
return ''
def generate_unique_slug(self): def generate_unique_slug(self):
""" """
Create a unique slug by passing the result of get_slug() to Create a unique slug by passing the result of get_slug() to
@ -173,37 +149,6 @@ class Article(TranslatableModel):
""" """
return u'%s' % self.lazy_translation_getter('main_title', self.pk) return u'%s' % self.lazy_translation_getter('main_title', self.pk)
def _get_next_or_previous_by_publish_date(self, is_next, **kwargs):
"""
Retrieves next or previous object by publish date. We implement
our own version instead of Django's so we can hook into the
published manager and concrete subclasses.
"""
arg = "publish_date__gt" if is_next else "publish_date__lt"
order = "publish_date" if is_next else "-publish_date"
lookup = {arg: self.publish_date}
concrete_model = base_concrete_model(Article, self)
try:
queryset = concrete_model.objects.published
except AttributeError:
queryset = concrete_model.objects.all
try:
return queryset(**kwargs).filter(**lookup).order_by(order)[0]
except IndexError:
pass
def get_next_by_publish_date(self, **kwargs):
"""
Retrieves next object by publish date.
"""
return self._get_next_or_previous_by_publish_date(True, **kwargs)
def get_previous_by_publish_date(self, **kwargs):
"""
Retrieves previous object by publish date.
"""
return self._get_next_or_previous_by_publish_date(False, **kwargs)
def admin_url(self): def admin_url(self):
""" """
returns url for admin pages returns url for admin pages

@ -1,186 +0,0 @@
{% extends 'base.html' %}
{% load static %}
{# Displays article form #}
{% block scripts %}
<script src="{% static 'ckeditor/ckeditor/ckeditor.js' %}"></script>
{# selects #}
<link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/>
<script src="{% static 'js/select/select2.js' %}"></script>
{# ajax #}
<script src="{% static 'custom_js/file_post_ajax.js' %}"></script>
<script src="{% static 'custom_js/select_tag.js' %}"></script>
{% endblock %}
{% block body %}
{# Uses multilang.html template for translated fields #}
<form method="post" class="form-horizontal" name="form2" id="form2"> {% csrf_token %}
<fieldset>
<legend><i class="icon-edit"></i>{% if obj_id %} Изменить {% else %} Добавить {% endif %}статью</legend>
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-pencil"></i> Основная информация</h2>
</div>
<div class="box-content">
{# Hidden input uses for comparing with TmpFile objects #}
{{ form.key }}
{# Hidden input uses in clean method for checking url #}
{{ form.article_id }}
{# main_title #}
{% include 'c_admin/forms/multilang.html' with field='main_title' form=form languages=languages %}
{# theme #}
<div class="control-group {% if form.theme.errors %}error{% endif %}">
<label class="control-label"><b>{{ form.theme.label }}:</b></label>
<div class="controls">
{{ form.theme }}
<span class="help-inline">{{ form.theme.errors }}</span>
</div>
</div>
{# tag #}
<div class="control-group {% if form.tag.errors %}error{% endif %}">
<label class="control-label">{{ form.tag.label }}:</label>
<div class="controls">
{{ form.tag }}
<span class="help-inline">{{ form.tag.errors }}</span>
</div>
</div>
{# preview #}
{% include 'c_admin/forms/multilang.html' with field='preview' form=form languages=languages %}
{# author #}
<div class="control-group {% if form.author.errors %}error{% endif %}">
<label class="control-label">{{ form.author.label }}:</label>
<div class="controls">
{{ form.author }}
<span class="help-inline">{{ form.author.errors }}</span>
</div>
</div>
{# description #}
{% include 'c_admin/forms/multilang.html' with field='description' form=form languages=languages %}
{# keywords #}
{% include 'c_admin/forms/multilang.html' with field='keywords' form=form languages=languages %}
{# title #}
{% include 'c_admin/forms/multilang.html' with field='title' form=form languages=languages %}
{# descriptions #}
{% include 'c_admin/forms/multilang.html' with field='descriptions' form=form languages=languages %}
</div>
</div>
<div class="box span8" id="file">
<div class="box-header well">
<h2><i class="icon-pencil"></i> Файлы</h2>
</div>
<div class="box-content">
{# button that shows modal window with file form #}
<a href="#myModal" id="file_add" role="button" class="btn btn-info" data-toggle="modal">Добавить файл</a>
{# this div shows list of files and refreshes when new file added #}
<div id="file_list">
<table class="table table-hover">
<thead>
<tr>
<td>id</td>
<td>Файл</td>
<td>Имя</td>
<td>Назначение</td>
<td></td>
</tr>
</thead>
<tbody>
{% for file in files %}
<tr>
<td>{{ file.id }}</td>
<td><img src="{{ file.file_path.url }}"></td>
<td>{{ file.file_name }}</td>
<td>{{ file.purpose }}</td>
<td>
<button class="btn btn-danger delete_file" value="{{ file.id }}">
<i class="icon-trash icon-white"></i> Удалить
</button>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
<div class="controls">
<input class="btn btn-large btn-primary" type="submit" value="Добавить">
<input class="btn btn-large" type="reset" value="Отмена">
</div>
</fieldset>
</form>
{# modal window #}
<div class="modal hide fade" id="myModal" >
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true" id="close">&times;</button>
<h3>Добавить файл</h3>
</div>
<div id="form_body">
<div class="modal-body">
<form method="post" class="form-horizontal" enctype="multipart/form-data" name="file_form" id="file_form" > {% csrf_token %}
{# hidden inputs uses for comparing with Article form key#}
{{ file_form.key }}
{{ file_form.model }}
<input type="hidden" id="obj_id" value="{{ obj_id }}">
{# file_path #}
<div class="control-group{% if file_form.file_path.errors %}error{% endif %}">
<label class="control-label"><b>{{ file_form.file_path.label }}:</b></label>
<div class="controls">{{ file_form.file_path }}
<span class="help-inline">{{ file_form.file_path.errors }}</span>
</div>
</div>
{# file purpose #}
<div class="control-group{% if file_form.purpose.errors %}error{% endif %}">
<label class="control-label"><b>{{ file_form.purpose.label }}:</b></label>
<div class="controls">{{ file_form.purpose }}
<span class="help-inline">{{ file_form.purpose.errors }}</span>
</div>
</div>
{# file_name #}
{% with field='file_name' form=file_form languages=languages %}
{% include 'c_admin/forms/multilang.html' %}
{% endwith %}
{# file_description #}
{% with field='description' form=file_form languages=languages %}
{% include 'c_admin/forms/multilang.html' %}
{% endwith %}
</div>
<div class="modal-footer">
<div class="controls">
<input class="btn btn-primary" type="submit" value="Добавить">
<input type="reset" class="btn" value="Отменить" data-dismiss="modal">
</form>
</div>
</div>
</div>
</div>
{% endblock %}

@ -1,69 +0,0 @@
{% extends 'base.html' %}
{% block body %}
{% comment %}
Displays lists of all articles in the table
and creating buttons which can change each article
{% endcomment %}
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-arrow-down"></i>Список статей</h2>
</div>
<div class="box-content">
<form class='form-search'>
{{ search_form.search_name }}
<button type="submit" class="btn">Найти</button>
</form>
<table class="table table-hover">
<thead>
<tr>
<th>Заголовок</th>
<th>Автор</th>
<th>&nbsp;</th>
</tr>
</thead>
<tbody>
{% for item in objects %}
<tr>
<td>{{ item.main_title }}</td>
<td>{% ifnotequal item.user None %}{{ item.user }} {% endifnotequal %}</td>
<td class="center sorting_1">
<a class="btn-small btn-info" href="/admin/article/change/{{ item.url|lower }}">
Изменить
</a>
</td>
<td class="center sorting_1">
<a class="btn-small btn-inverse" href="/admin/article/copy/{{ item.url|lower }}">
Копировать
</a>
</td>
<td>
<a class="btn-small btn-danger delete" href="/admin/article/delete/{{ item.url }}/">
Удалить
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
<a class="btn btn-success" href="/admin/article/add"><i class="icon-plus-sign icon-white"></i> Добавить статью</a>
</div>
<div class="pagination pagination-centered">
<ul>
{% if objects.has_previous %}
<li> <a href="?page={{ objects.previous_page_number }}"></a></li>
{% endif %}
{% if objects.has_next %}
<li><a href="?page={{ objects.next_page_number }}"></a></li>
{% endif %}
</ul>
</div>
</div>
{% endblock %}

@ -1,34 +1,35 @@
{% extends 'base.html' %} {% extends 'base.html' %}
{% load static i18n %} {% load static %}
{% load i18n %}
{% block scripts %} {# Displays article form #}
<script src="{% static 'ckeditor/ckeditor/ckeditor.js' %}"></script>
{# selects #} {% block scripts %}
<link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/>
<script src="{% static 'js/select/select2.js' %}"></script> <script src="{% static 'ckeditor/ckeditor/ckeditor.js' %}"></script>
{# ajax #} {# selects #}
<script src="{% static 'custom_js/file_post_ajax.js' %}"></script> <link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/>
<script src="{% static 'custom_js/select_tag.js' %}"></script> <script src="{% static 'js/select/select2.js' %}"></script>
<script src="{% static 'custom_js/make_select.js' %}"></script>
{# ajax #}
<link href="{% static 'js/datetimepicker/css/datetimepicker.css' %}" rel="stylesheet"/> <script src="{% static 'custom_js/file_post_ajax.js' %}"></script>
<script src="{% static 'js/datetimepicker/js/bootstrap-datetimepicker.js' %}"></script> <script src="{% static 'custom_js/select_tag.js' %}"></script>
<script>
$(document).ready(function(){
$('#id_publish_date').datetimepicker({ <link href="{% static 'js/datetimepicker/css/datetimepicker.css' %}" rel="stylesheet"/>
todayHighlight: true, <script src="{% static 'js/datetimepicker/js/bootstrap-datetimepicker.js' %}"></script>
format : 'yyyy-mm-dd', <script>
minView:2 $(document).ready(function(){
}); $('#id_publish_date').datetimepicker({
todayHighlight: true,
}); format : 'yyyy-mm-dd',
</script> minView:2
});
<link rel="stylesheet" href="{% static 'jQuery-filer/css/jquery.filer.css' %}">
<link rel="stylesheet" href="{% static 'jQuery-filer/css/jquery.filer-dragdropbox-theme.css' %}"> });
<script src="{% static 'jQuery-filer/js/jquery.filer.js' %}"></script>
<script src="{% static 'jQuery-filer/js/init.js' %}"></script> </script>
{% endblock %}
{% endblock %}
{% block body %} {% block body %}
{{ form.errors }} {{ form.errors }}
@ -132,9 +133,38 @@
</div> </div>
</div> </div>
<div class="box span8" id="file">
<div class="box-header well">
<h2><i class="icon-pencil"></i> {% trans "Файлы" %}</h2>
</div>
<div class="box-content">
{% if article %}
{# button that shows modal window with file form #}
<a href="#myModal" id="file_add" role="button" class="btn btn-info" data-toggle="modal">{% trans "Добавить файл" %}</a>
{% else %}
<p>{% trans "Файлы можно добавлять только после введения основных данных" %}</p>
{% endif %}
{# this div shows list of files and refreshes when new file added #}
<div id="file_list">
<table class="table table-hover">
{% include 'c_admin/includes/filegallery.html' with object=article model='article.Article' %} <thead>
<tr>
<td>{% trans "id" %}</td>
<td>{% trans "Файл" %}</td>
<td>{% trans "Имя" %}</td>
<td>{% trans "Назначение" %}</td>
<td></td>
</tr>
</thead>
<tbody>
{% include 'file_list.html' with files=files %}
</tbody>
</table>
</div>
</div>
</div>
{% if form.draft %} {% if form.draft %}
<div class="box span8"> <div class="box span8">
<div class="control-group {% if form.draft.errors %}error{% endif %}"> <div class="control-group {% if form.draft.errors %}error{% endif %}">
@ -154,6 +184,7 @@
</fieldset> </fieldset>
</form> </form>
{% include 'c_admin/includes/file_form.html' with file_form=file_form object=article %}
{% endblock %} {% endblock %}

Loading…
Cancel
Save