Συζήτηση
Γεια χαρά, Επισκέπτης
Όνομα χρήστη: Κωδικός: Να με θυμάσαι

ΘΕΜΑ: Processing φορμας και django

Processing φορμας και django 7 Χρόνια 9 Μήνες πριν #3783

  • pol2005
  • Το Άβαταρ του/της pol2005
  • Αποσυνδεμένος
  • p_____
  • Δημοσιεύσεις: 4
Καλησπερα σε ολους.Εχω μια εφαρμογη φτιαγμενη με django και εχω μια απορια για το processing μιας φορμας.
Το layout.html ειναι ως εξης:
<!DOCTYPE html>
<html>
<head>
<title>Page Title</title>
</head>
<body>

{% include "header.html" %}
{% block content %}
{% endblock %}
{% include "footer.html" %}

</body>

Το footer ειναι ως εξης:
{% block1 %}
{% block2 %}
{% block3 %}

Οπου block 1,2 και 3 ειναι inclusion tags.To block1 περιεχει τη φορμα.
Η ερωτηση μου ειναι η εξης.Ποιος ειναι ο καλυτερος τροπος να κανω processing τη φορμα(πχ να βαλω περιεχομενο στη βαση).
Αυτη τη στιγμη εχω τη φορμα ,ενα inclusion tag που κανει generate τη φορμα και ενα view που στελνω τη φορμα εκει.

inclusion tag

@register.inclusion_tag('templates/newsletter.html')
def block1():
newsletter = NewsletterForm()
return {'newsletter': newsletter}

newletter.html

<form action="/newsletter/" method="post" >
{% csrf_token %}

{{ newsletter.as_p }}

<p><input type="submit" value="Subscribe"></p>
</form>

views.py

def newsletter(request):
if request.method == 'POST':
newsletter = NewsletterForm(data=request.POST)
if newsletter.is_valid():
newsletter.save()
messages.success(request, 'Το email σας προστέθηκε επιτυχώς')
return render(request,'index.html')
messages.error(request, 'Το email σας υπάρχει ηδη καταχωρημένο')
return render(request, 'index.html'

urls.py

url(r'^newsletter/', views.newsletter,name='newsletter'),

Ειναι αυτος ο ενδεδειγμένος τροπος να το κανω αυτο?Το λεω γιατι αντιμετωπισα προβληματα οπως προσπαθησα να μεταφερθω στη σελίδα που εκανα submit τη φορμα αλλα δεν τα καταφερα.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Processing φορμας και django 7 Χρόνια 8 Μήνες πριν #3784

  • Αποστόλης
  • Το Άβαταρ του/της Αποστόλης
  • Αποσυνδεμένος
  • pytho_
  • Δημοσιεύσεις: 148
  • Ληφθείσες Ευχαριστίες 24
Η function στο view.py είναι, όπως θα έχεις καταλάβει, απαραίτητη.
Από εκεί και πέρα ο σωστός ή λάθος τρόπος κρίνεται από το αν ο κώδικάς σου δημιουργεί θέματα ασφαλείας, καταπονεί τον server αναίτια, ή η εφαρμογή σου γίνεται χαώδης.
Το Django προτείνει να δημιουργείς την φόρμα με τον αντίστοιχο τρόπο που δημιουργείς όλα τα αρχεία, πλην των css, html. Δηλαδή με ένα αρχείο py. Το forms.py Κι αυτό για να μπορεί να "ελέγχει" καλύτερα τη φόρμα σου. Δεν είναι απόλυτο όμως και έχε υπόψη οτι αν μεταφέρεις την εφαρμογή σου σε άλλη version του Django μάλλον θα αντιμετωπίσεις αρκετά προβλήματα. Ενώ με ένα html file είναι πιο εύκολο.
Αυτό που θα μπορούσες να παραλείψεις, ίσως, είναι το tag {%block κάτι%}. Τα blocks αυτά έχουν την έννοια της εύκολης και γρήγορης επαναχρησιμοποίησης κώδικα/σελίδας κ.λ.π. Αν δεν έχεις σκοπό να χρησιμοποιήσεις την ίδια φόρμα και σε άλλες σελίδες, δεν υπάρχει λόγος να το κάνεις με με αυτό τον τρόπο. Ένα απλό render(request, html form) στο views αρκεί. Οχι οτι υπάρχει πρόβλημα με τον τρόπο που το κάνεις αλλά σε γενικές γραμμές (σε όλες τις γλώσες προγραμματισμού) το να ανοίγοκλείνεις code tags για ψύλου πήδημα, δεν είναι η καλύτερη πρακτική.

Τι πρόβλημα αντιμετώπισες με την φόρμα;
Τελευταία διόρθωση: 7 Χρόνια 8 Μήνες πριν από Αποστόλης.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Processing φορμας και django 7 Χρόνια 8 Μήνες πριν #3785

  • pol2005
  • Το Άβαταρ του/της pol2005
  • Αποσυνδεμένος
  • p_____
  • Δημοσιεύσεις: 4
Ευχαριστω πολυ για την απαντηση σου.
Το προβλημα που αντιμετωπισα ειναι οτι ηθελα να κανω redirect στην σελιδα απο οπου ηρθε ο χρηστης( γιατι το processing γινεται στο example.com/newsletter ) και να περασω και καποιες μεταβλητες αλλα η ουτε η redirect ουτε η HttpResponseRedirect δεν τις περνουσε αυτες τις μεταβλητες στο template.
Και κατι αλλο.Εφοσον το footer το κανω include , πως μπορω να του περασω τη φορμα που θα εχω στο forms.py ?
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Processing φορμας και django 7 Χρόνια 8 Μήνες πριν #3786

  • Αποστόλης
  • Το Άβαταρ του/της Αποστόλης
  • Αποσυνδεμένος
  • pytho_
  • Δημοσιεύσεις: 148
  • Ληφθείσες Ευχαριστίες 24
Γενικώς και αορίστως:
Η κλήση φόρμας με τη χρήση του forms.py γίνεται στο views.py.
- Κάνεις import το ModelForm και τις κλάσεις που έχεις δημιουργήσει στο forms.
- Δημιουργείς είτε μια function, είτε μια generic.ListView class (αν θυμάμαι καλά δεν γίνεται με DetailView, δεν είμαι απόλυτος γι αυτό)
- Καλείς την φόρμα είτε με form = το όνομα της κλάσης που έχεις δημιουργήσει στο forms.py(request.POST/GET), είτε με return render(request, 'όνομα.html').
- Δημιουργείς το αντίστοιχο url pattern στο urls.py

Όλα αυτά στο Django 1.9 που προσωπικά το βρήκα αρκετά πιο εύχρηστο από άλλες version.
Σε παλαιότερες version συνάντησα αρκετά προβλήματα και τελικά το έκανα με τον απλό τρόπο.
Ισως να έτυχε σε μένα ή ίσως να επηρεάστηκα γιατί πρώτα έμαθα την έκδοση 1.9 και μετά αναγκάστηκα να μάθω παλαιότερες version, οπότε μπορεί να είμαι προκατειλημμένος. Αν έχεις χρόνο δοκίμασε. Καλό θα σου κάνει.
Όπως σου εξήγησα στο προηγούμενο μήνυμα με αυτό τον τρόπο το Django ελέγχει καλύτερα την "δομή" του.
Για παράδειγμα, με 3 γραμμές κώδικα ελέγχει αν ο χρήστης έχει γράψει κάτι στο πεδίο της φόρμας, αν έχει πατήσει το submit και σώζει τα δεδομένα. Για να τα κάνεις όλα αυτά με custom κώδικα, είναι πιο δύσκολο και θα χρειαστείς τριπλάσιο κώδικα, με αμφίβολα αποτελέσματα.

Για να κάνεις redirect:
return HttpResponseRedirect(reverse("η σελίδα που θέλεις") )

Για να περάσεις μεταβλητές:
return render(request, "αρχείο.html", {
	"όνομα μεταβλητής":μεταβλητή ή κείμενο,
	"όνομα μεταβλητής":μεταβλητή ή κείμενο,
	"όνομα μεταβλητής":μεταβλητή ή κείμενο
})

Για το register.inclusion_tag('templates/newsletter.html'):
Στο Django 1.9 το 'template/κάτι' είναι κακή πρακτική. Τα templates, static και media paths τα αφήνεις να τα χειρίζεται το Django. Το μόνο που έχεις να κάνεις είναι να φτιάξεις ένα folder tree όπως το θέλει η εφαρμογή. Σε παλιότερες εκδόσεις, καλύτερα να το κάνεις όπως το έχεις γιατί θα τραβάς τα μαλλιά σου...

Για το footer:
Αν κατάλαβα καλά, θέλεις να κάνεις include το footer.html κι εκεί μέσα να καλέσεις τη φόρμα σου.
Αν όντως ισχύει αυτό έχεις ξεκινήσει λάθος. Η έννοια του footer είναι να έχει "σταθερό" content (π.χ. copyright, links, email addresses, κώδικα javascript κ.λ.π.) και δεν το χρησιμοποιούμε για να καλούμε άλλα αρχεία.
Πρέπει να ξαναδείς την δομή της εφαρμογής σου.

Υ.Γ. αν μπερδεύτηκες με αυτά που σου έγραψα μπορώ να σου γράψω κάποια παραδείγματα.
Αλλά όπως πάντα, καλύτερα RTFM :) .
Τελευταία διόρθωση: 7 Χρόνια 8 Μήνες πριν από Αποστόλης.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Processing φορμας και django 7 Χρόνια 8 Μήνες πριν #3787

  • pol2005
  • Το Άβαταρ του/της pol2005
  • Αποσυνδεμένος
  • p_____
  • Δημοσιεύσεις: 4
Όχι δεν μπερδεύτηκα ίσα ίσα που μου τα ξεκαθάρισες και λιγο, αν και πάνω κάτω τα έχω καταλάβει αυτά από το documentation του django.Αλλά ας πούμε έχεις μια φόρμα όπως εγώ οπου μαζεύεις emails για το newsletter.Αυτή η φόρμα θες να εμφανιζεται σε κάθε σελίδα στο site, και τη βαζεις στο φούτερ η σε ένα sidebar. Πως μπορείς να την εμφανίζεις παντού? Το μόνο που σκέφτηκα επειδή δεν μπορείς να έχεις ένα view για όλο το site είναι ένα inclusion tag οπου θα επιστρέφει μόνο τη φόρμα και το processing να το κανεις εκεί όπου θα κάνει post η φόρμα.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Processing φορμας και django 7 Χρόνια 8 Μήνες πριν #3788

  • Αποστόλης
  • Το Άβαταρ του/της Αποστόλης
  • Αποσυνδεμένος
  • pytho_
  • Δημοσιεύσεις: 148
  • Ληφθείσες Ευχαριστίες 24
Λίγο "περίεργο" να θες να εμφανίζεται σε όλο το site αλλά εντάξει.
Σε αυτή την περίπτωση το βάζεις στο base.html Το template σου δηλαδή, ουσιαστικά.
Οπότε:
α)
- Βάζεις TEMPLATE_CONTEXT_PROCESSORS = ( "my_app_name.context_proecssors.my_form_name") στο settings.py
- Δημιουργείς ένα αρχείο context_processors.py όπου εκεί καλείς την φόρμα σου περίπου όπως θα την καλούσες στο views.py
from myForm import MyFormClass
def i_forma_moy(request):
	return{
		"η φόρμα μου":MyFormClass()
	}
- Καλείς την φόρμα σου με
{{ i_forma_moy }}

ή

β)
Δημιουργείς ένα custom tag και το κάνεις import.
π.χ. {% import_my_form %}

docs.djangoproject.com/en/dev/howto/cust...custom-template-tags
Τελευταία διόρθωση: 7 Χρόνια 8 Μήνες πριν από Αποστόλης.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Processing φορμας και django 7 Χρόνια 8 Μήνες πριν #3789

  • pol2005
  • Το Άβαταρ του/της pol2005
  • Αποσυνδεμένος
  • p_____
  • Δημοσιεύσεις: 4
Τελικα το εκανα με το δευτερο τροπο.Οπως δηλαδη το ειχα απο την αρχη.
Σε ευχαριστω πολυ για τις απαντησεις σου.
Και μια που μιλαμε για django, εχω δοκιμασει σχεδον ολα τα framework που κυκλοφορουν.
Το django ειναι νομιζω το καλυτερο.Εχω εντυπωσιαστει πραγματικα.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Processing φορμας και django 7 Χρόνια 8 Μήνες πριν #3790

  • Αποστόλης
  • Το Άβαταρ του/της Αποστόλης
  • Αποσυνδεμένος
  • pytho_
  • Δημοσιεύσεις: 148
  • Ληφθείσες Ευχαριστίες 24
- Όλα καλά λοιπόν. :)

- Αναφορικά με την Python δεν έχω δοκιμάσει άλλο framework, οπότε δεν ξέρω να σου πω περισσότερα. Σε σύγκριση με frameworks άλλων γλωσσών προγραμματισμού, έχει κάποιες "παιδικές ασθένειες" αλλά σε γενικές γραμμές καλό είναι. Κι όπως συμβαίνει με όλα τα frameworks η δυσκολία είναι μέχρι να καταλάβεις τον τρόπο που δουλεύουν.
Εγώ γενικά είμαι κατά των πάσης φύσεως frameworks, cms κ.λ.π. αλλά η αλήθεια είναι οτι σου ανεβάζουν το productivity και για ομάδες προγραμματιστών, πάνω από 4-5, που δουλεύουν στο ίδιο έργο είναι μονοδρομος.
Ένα από τα άσχημα που έχουν είναι οτι καταλήγεις να μαθαίνεις/χρησιμοποιείς το framework κι όχι προγραμματισμό ή την εκάστοτε γλώσσα προγραμματισμού.
Ειδικά με τα μεγάλα frameworks όπως το Zend για παράδειγμα μετά από 1-2 χρόνια έχεις εγκλωβιστεί τελείως σε αυτά και αν σου πουν να φτιάξεις κάτι διαφορετικό χάνεις τη μπάλα.
Το Django ευτυχώς δεν είναι έτσι ακόμα, αλλά είναι σχεδόν σίγουρο ότι αυτό είναι το σημείο που θέλουν να φτάσουν.
Γι αυτό κατά την άποψή μου, παρακολούθα τις εξελίξεις αλλά μην εγκλωβίζεσαι σε τέτοια "εργαλεία".
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Συντονιστές: pmav99
Χρόνος δημιουργίας σελίδας: 0.329 δευτερόλεπτα

Μοιράσου το!

Powered by CoalaWeb

Λίστα Ταχυδρομείου