2016-07-23 2 views
0

У меня есть поле формы, как этотКак я могу поднять Validation Error для FileField

class FeedForm(ModelForm): 
    files=form.FileField(validators=[validate_file_extension]) 
    class Meta: 
     model=Feed 
     fields=('text','auth','files',) 

с валидатор используется для обеспечения конкретных типов файлов: validator.py

def validate_file_extension(value): 
    ext = os.path.splitext(value.name)[1] # [0] returns path+filename 
    valid_extensions = ['.pdf', '.doc', '.docx', '.jpg', '.png', '.xlsx', '.xls'] 
    if not ext.lower() in valid_extensions: 
     raise ValidationError(u'Unsupported file extension.') 

Я хочу поднимите вышеуказанную ошибку проверки в моем шаблоне, как я могу это сделать?

views.py, которые генерируют форму:

def post_feed(request): 
form_class = FeedForm 
if request.method == 'POST': 
    form = form_class(request.POST,request.FILES) 
    if form.is_valid(): 
     feed = form.save(commit=False) 
     feed.user = User.objects.get(pk=7) 
     feed.pub_date=timezone.now() 
     #instance = Feed(files=request.FILES['files']) 
     # feed.files=request.FILES['files'] 
     feed.save() 
     return redirect('home') 

else: 
    form = form_class() 
concern='Concern' 
feeds=Feed.objects.filter(pub_date__lte=timezone.now()).order_by('-pub_date') 
paginator = Paginator(feeds,5) # Show 25 contacts per page 
page = request.GET.get('page') 
try: 
    feedz = paginator.page(page) 
except PageNotAnInteger: 
    feedz = paginator.page(1) 
except EmptyPage: 
    feedz = paginator.page(paginator.num_pages) 

#return redirect('home') 
return render_to_response('index.html', {"feeds":feeds,"feedz": feedz,'form':FeedForm(),'feed_detail':feed_detail,}) 

вид, что форма на использование include тега:

def home(request): 
    concern='Concern' 
    feeds=Feed.objects.filter(pub_date__lte=timezone.now()).order_by('-pub_date') 
    paginator = Paginator(feeds,5) # Show 25 contacts per page 
    page = request.GET.get('page') 
    try: 
     feedz = paginator.page(page) 
    except PageNotAnInteger: 
     # If page is not an integer, deliver first page. 
     feedz = paginator.page(1) 
    except EmptyPage: 
     # If page is out of range (e.g. 9999), deliver last page of results. 
     feedz = paginator.page(paginator.num_pages) 
    return render_to_response('index.html', {"feeds":feeds,"feedz": feedz,'form':FeedForm(),'feed_detail':feed_detail,},context_instance=RequestContext(request)) 

HTML, который генерирует форму: post_feed.html

<form role="form" action="{% url 'post_feed' %}" enctype="multipart/form-data" method="post"> 
    {% csrf_token %} 
    <div class="mdl-textfield mdl-js-textfield "> 
    {{form.text}} 
    <label class="mdl-textfield__label" for="{{form.text.id_for_label}}">Cheated on?Blow the whistle here</label> 
    </div> 
    <div class="mdl-select mdl-js-select mdl-select--floating-label"> 
    <label class="mdl-select__label" for="{{form.auth.id_for_label}}">Authority addressed to:<br/></label> 
    {{form.auth}} 

    </div><br/> 


     {{form.files}} 



    <br/> {{form.files2}} 
    <br/> {{form.files3}} 

    <br/><br/> <button class="mdl-button mdl-js-button mdl-js-ripple-effect mdl-button--raised mdl-button--colored">Post</button> 
    {% if form.errors %} 
    {% for field in form %} 
    {% for error in field.errors %} 
    <div class="alert alert-error"> 
    <strong>{{error|escape}}</strong> 
    </div> 
    {% endfor %} 
    {% endfor %} 
    {% endif %} 

    </form> 

html, который имеет вышеуказанную форму, используя тег include

{% include "post_feed.html" %} 
    <h2>Feed Stream</h2> 

    {% for feed in feedz %} 
     <strong> {{feed.full_name_of_poster|title}} </strong> | 
      {% if feed.resolved == True %} 
      RESOLVED 
      {% else %} 
      UNRESOLVED 
      {% endif %} 
      <p> To:<a href="{% url 'authority_details' pk=feed.auth.pk slug=feed.auth.slug %}">{{feed.auth}} </a></p> 

      <p>{{feed.text}} </p> 
      <a href="{% url 'feed_detail' slug=feed.slug %}">Full details</a> 
      <p id='count'> {{feed.total_concerns}} concern{{feed.total_concerns|pluralize:'s'}} &nbsp {{feed.no_of_comments}} comment{{feed.no_of_comments|pluralize:'s'}} </p> 
      <p> {{feed.pub_date|naturaltime|capfirst}} </p> 

      <hr/> 
      {% endfor %} 
<div class="pagination"> 
    <span class="step-links"> 
     {% if feedz.has_previous %} 
      <a href="?page={{ feedz.previous_page_number }}">previous</a> 
     {% endif %} 
<span class="current"> 
      Page {{ feedz.number }} of {{ feedz.paginator.num_pages }}. 
     </span> 
     {% if feedz.has_next %} 
      <a href="?page={{ feedz.next_page_number }}">next</a> 
     {% endif %} 
    </span> 
</div> 
{% endblock %} 

Я прошел через документы, но не прорыв, Пожалуйста, помогите мне out.Thanks заранее

ответ

0

Обычный формат для основанного зрения функции, которая обрабатывает форму является:

def post_feed(request): 
    form_class = FeedForm 
    if request.method == 'POST': 
     form = form_class(request.POST,request.FILES) 
     if form.is_valid(): 
      # process the form then redirect 
      ... 
      return redirect('home') 
     else: 
      # You don't actually need this else statement here 
      print form.errors 
    else: 
     # create blank form for GET requests 
     form = form_class() 
    # Now return a response for GET requests and invalid POST requests 
    concern='Concern' 
    feeds=Feed.objects.filter(pub_date__lte=timezone.now()).order_by('-pub_date') 
    return render(request , 'index.html' ,{'feeds':feeds,'form':FeedForm(),'feed_detail':feed_detail,}) 

Поэтому вам просто нужно изменить отступ в конце представления, чтобы вы также возвращали ответ на недопустимые запросы POST.

Django автоматически отображает любые ошибки проверки, если вы используете {{ form }} в своем шаблоне. Если вы визуализируете поля в отдельности, обратитесь к документам для визуализации полей вручную, чтобы вручную включать ошибки.

+0

Спасибо за ваше предложение. Я реализовал его, но еще не работал. Но проблема заключается в том, что я использую «include», чтобы поместить форму, сгенерированную view.post_feed, в другой view.home делает это сложный. В настоящее время, когда я помещаю недопустимый файл. Он просто загружает всю страницу заново, не принося никакой ошибки. Я обновлю свой вопрос, надеясь, что вы сможете помочь –

+0

Ваш обновленный код создает новую форму, когда вы возвращаете ответ: '' форма ': FeedForm() '. Это пустая форма, поэтому никаких ошибок нет. Вы должны передать форму, созданную ранее в представлении. В стороне, не используйте 'render_to_response', он устарел. Вместо этого используйте 'render'. – Alasdair

+0

Это отлично сработало. Теперь я понимаю суть визуализации параметров. Большое спасибо –