Hello Mathias,

Thanks for the quick answer, it solved the main problem :)
Here is my code if it can help someone:

models.py:
# -*- coding: utf-8 -*-
from django.db import models
from mezzanine.conf import settings as mezzSettings
from mezzanine.pages.models import Page
from mezzanine.core.models import RichText
from django.utils.translation import ugettext_lazy as _

class UploadPage(Page, RichText):
    """Page pour l'upload des annexes"""
    class Meta:
        verbose_name = _("Upload page")
        verbose_name_plural = _("Upload pages")

class Document(models.Model):
    """Modèle représentatif d'un document annexe"""
    docfile = models.FileField(upload_to=mezzSettings.PDT_VERSION, 
help_text="Ajouter un document en annexe.")
    uploadpage = models.ForeignKey("UploadPage", related_name="files") 

##################################################################################################"
admin.py

# -*- coding: utf-8 -*-
from django.contrib import admin

from mezzanine.core.admin import TabularDynamicInlineAdmin
from mezzanine.pages.admin import PageAdmin
from .models import UploadPage, Document

class DocumentInline(TabularDynamicInlineAdmin):
    model = Document

class UploadPageAdmin(PageAdmin):
    inlines = (DocumentInline,)

admin.site.register(UploadPage, UploadPageAdmin)

##################################################################################################"
page_processors.py:

# -*- coding: utf-8 -*-
from django import forms
from django.http import HttpResponseRedirect
from mezzanine.pages.page_processors import processor_for
from .models import Document, UploadPage
from django.db import models
from mezzanine.conf import settings as mezzSettings

class DocForm(forms.Form):
    docfile = forms.FileField(help_text="Ajouter un document en annexe.")

@processor_for(UploadPage)
def uploadpage_form(request, page):
    pageform = DocForm()
    succes = None
    if request.method == "POST":
     pageform = DocForm(request.POST, request.FILES)
     if pageform.is_valid():
        Document(docfile = request.FILES['docfile'], uploadpage = 
page.uploadpage).save()
        return {"pageform":pageform, "succes":"Ca a marché"}
    else:
     succes = "Ca a pas marché"
    return {"pageform":pageform, "succes":succes}

##################################################################################################"
part of code from page.uploadpage.html:

<form name="uploadForm" method="POST" enctype="multipart/form-data" 
action="#">
{% csrf_token %}
  {% if succes %}
  <p>{{ succes }}</p>
  {% endif %}
  <p> help_text : {{ pageform.docfile.help_text }}</p>
  {% fields_for pageform %}
  <p><input type="submit" value="Envoyer le fichier"></p>
</form>

Cya next time !

Quentin

Le jeudi 4 juin 2015 00:08:24 UTC+2, Mathias Ettinger a écrit :
>
> Hi Quentin,
>
> The @processor_for decorator is totally suited to manage form validation, 
> have a look at mezzanine.forms.page_processors for a working example.
>
> Some advices on your code, though:
>  - I don't think that “if request.method == ("post" or "POST")” really 
> does what you think it does. You’d better use “if request.method == "post" 
> or request.method =="POST"“ or better “if request.method == "POST"“ or even 
> better, get rid of this if and create the form as “form = 
> DocForm(request.POST or None, request.FILES or None)”
>  - Your model has a ForeignKey for an UploadPage model and you’re creating 
> it with “uploadpage = page.id”. It would be wiser to use the page 
> instance instead of its id.
>  - Upon successful validation, you redirect the visitor to “request.path + 
> '?submitted=true'” which is basically the same view but you never handle 
> this GET parameter in your page processor. Is it by design?
>
> (also, why don't you use quotation marks or diacritics in your docstrings?)
>
> Cheers,
>
>
> Le mercredi 3 juin 2015 18:07:25 UTC+2, Quentin M a écrit :
>>
>> [Update] I just found the "page_processor" so I will test if it is the 
>> solution, but not sure if the page_processor will make it with the 
>> "ForeignKey" attribute...
>> [Edit] I tested with the page processor but it don't works ... can 
>> page_processor validate a form ?
>>
>> page_processors.py : 
>> from django import forms
>> from django.http import HttpResponseRedirect
>> from mezzanine.pages.page_processors import processor_for
>> from .models import Document, UploadPage
>> from django.db import models
>>
>> class DocForm(forms.Form):
>>     docfile = models.FileField(upload_to=mezzSettings.PDT_VERSION, 
>> help_text="Ajouter un document en annexe.")
>>
>> @processor_for(UploadPage)
>> def uploadpage_form(request, page):
>>     form = DocForm()
>>     if request.method == ("post" or "POST"):
>>         form = DocForm(request.POST, request.FILES)
>>         if form.is_valid():
>>             Document(docfile = request.FILES['docfile'], uploadpage = 
>> page.id).save()
>>             redirect = request.path + "?submitted=true"
>>             return HttpResponseRedirect(redirect)
>>     return {"form":form} 
>>
>> Le mercredi 3 juin 2015 11:13:56 UTC+2, Quentin M a écrit :
>>>
>>> Firstly Hello ! I am Mezzanine newbie and I would like to have some 
>>> help. I know there are many similar questions but no one answers my 
>>> question.
>>> I have a model called "Document" assiociated to a custom page 
>>> "UploadPage" :
>>>
>>> models.py :
>>> # -*- coding: utf-8 -*-
>>> from django.db import models
>>> from django.utils.translation import ugettext_lazy as _
>>>
>>> from mezzanine.conf import settings as mezzSettings
>>> from mezzanine.pages.models import Page, RichText
>>>
>>>
>>>
>>> class UploadPage(Page, RichText):
>>>      """Page pour l upload des annexes"""
>>>      class Meta:
>>>          verbose_name = _("Upload page")
>>>          verbose_name_plural = _("Upload pages")
>>>
>>> class Document(models.Model):
>>>      """Modele representatif d un document annexe"
>>>      docfile = models.FileField(upload_to=mezzSettings.PDT_VERSION)
>>>      uploadpage = models.ForeignKey("UploadPage", related_name="files")
>>>
>>>
>>> admin.py :
>>> # -*- coding: utf-8 -*-
>>> from django.contrib import admin
>>>
>>> from mezzanine.core.admin import TabularDynamicInlineAdmin
>>> from mezzanine.pages.admin import PageAdmin
>>>
>>> from quentinApp.models import UploadPage, Document
>>>
>>> class DocumentInline(TabularDynamicInlineAdmin):
>>>      model = Document
>>>
>>> class UploadPageAdmin(PageAdmin):
>>>      inlines = (DocumentInline,)
>>>
>>> admin.site.register(UploadPage, UploadPageAdmin)
>>>
>>> This code works but I would like to add a form field in this page 
>>> (displayed in the site) that allow an user to upload a file (no worries 
>>> about the security it's an intranet site).
>>> I have already tested with a "form page" with field form but I don't 
>>> like the way it stores the documents (create an unique "jksdfdfjkhomp" key 
>>> folder for the document).
>>> Should I add a Custom form field wich upload a file and create the page 
>>> related object "Document"... In the documentation I found the "fields_for" 
>>> function so the custom form must be the key, but I have no ideas how to 
>>> make it. 
>>> Ps: I have some difficulties in expressing myself in English, do not 
>>> hesitate to ask me if I was not clear.
>>>
>>> Cordially,
>>> Quentin
>>>
>>>

-- 
You received this message because you are subscribed to the Google Groups 
"Mezzanine Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to