2016-04-01 5 views
1

Ich habe ein Modellformular, das eine Anfrage für eine Änderung speichert und benachrichtigt die Administratoren per E-Mail, wenn ein neuer Eintrag erstellt wird. Der Administrator erhält eine milde Benachrichtigung mit dem Link, um den Eintrag http://mydjango/admin zu überprüfen und sich anzumelden, um die Anfrage anzuzeigen und zu genehmigen oder abzulehnen. Die Admins möchten, dass der obige Link sie direkt zum Eintrag und nicht zur Verwaltungsseite führt und sie durch die Liste der Einträge navigieren lässt, um die neueste zu finden. Ich muss sagen, dass ich neu zu Django bin und gerne sehen würde, ob das möglich ist. Ich habe bemerkt, dass, wenn ich zu einem Eintrag gehe und darauf klicke, der Link in meinem Browser eine eindeutige Nummer für ein Beispiel hat: http://127.0.0.1:8000/admin/app/changerequests/61/change/Django MySQL Eintrag eindeutige ID oder pk

gibt es 61, die sich für jeden Eintrag ändert. Also dachte ich mir, dass ich die "ID" des neu erstellten Eintrags in die E-Mail einfügen sollte, die an den Administrator gesendet wird.

ihr ist mein Modell, Form, Ansicht, admin

model.py:

from __future__ import unicode_literals 
from django.utils import timezone 
from django.db import models 
from django.core.mail import send_mail 
from django.conf import settings 
from app.forms import SignUpForm 

# Create your models here. 
class ChangeRequests(models.Model): 
    ENV_CHOICE = (
     ('select', 'Select'), 
     ('Production', 'Production'), 
     ('Lab', 'Lab'), 
     ('EBC_env', 'EBC_env'), 
     ('Los_Angles', 'Los Angles'), 
     ) 
    request_status = (
     ('select', 'Select'), 
     ('Pending...', 'Pending...'), 
     ('Approved', 'Approved'), 
     ('Denied', 'Denied'), 
     ('Added_comment', 'Added_comment'), 
     ) 
    email = models.EmailField() 

    full_name = models.CharField(max_length=120, blank=True, null=True) 
    timestamp = models.DateTimeField(auto_now_add=True, auto_now=False) 
    updated = models.DateTimeField(auto_now_add=False, auto_now=True) 
    what_is_the_change = models.TextField(max_length=250, null=True) 
    impact = models.TextField(max_length=250, null=True, help_text="Provide an example of the impact this change might cause") 
    environment = models.CharField(max_length=10, choices=ENV_CHOICE, default='select') 
    change_date_and_time = models.DateTimeField(default=timezone.now, verbose_name="Date/time of change. Use format: 3/30/2016 20:30")#, help_text="time example: <em>03/30/2016 20:30</em>") 
    #test_time = models.CharField(widget=SelectDateWidget, initial=datetime.date.today()) 
    status = models.CharField(max_length=20, choices=request_status, default='Pending...', blank=True) 
    status_reason = models.CharField(max_length=300, blank=True, null=True) 


    #this code is for checking the status of the request and sends an email with a message based on the comment left by the admins: 
    __original_status = None 
    def __init__(self, *args, **kwargs): 
     super(ChangeRequests, self).__init__(*args, **kwargs) 
     self.__original_status = self.status 


    def save(self, force_insert=False, force_update=False, *args, **kwargs): 
     if self.status != self.__original_status: 
      subject = "Request for a change status changed" 
      from_email = settings.EMAIL_HOST_USER + "@company.com" 
      if self.status_reason != "": 
       contact_message = """ 
      Hi: %s 
      Your request to make a change to: %s 
      Has been: (%s) 
      wiht the following comment: (%s) 
      """%(self.full_name, self.environment, self.status, self.status_reason) 
      else: 
       contact_message = """ 
       --------- 
       - Hi: %s 
       - 
       Your request to make a change to: %s 
       Has been: (%s) 
       """%(self.full_name, self.environment, self.status) 
      to_email = (self.email,) 
      send_mail(subject, contact_message, from_email, to_email, fail_silently=False) 





     super(ChangeRequests, self).save(force_insert, force_update, *args, **kwargs) 
     self.__original_status = self.status 




    def __unicode__(self): 
     return self.email 

forms.py:

from django import forms 
from app.models import ChangeRequests 
from django.utils import timezone 
import datetime 





class SignUpForm(forms.ModelForm): 
    class Meta: 
     model = ChangeRequests 
     fields = ('full_name', 'email', 'environment', 'what_is_the_change', 'change_date_and_time','impact') 


    def clean_email(self): 
     email = self.cleaned_data.get('email') 
     return email 

    def clean_full_name(self): 
     full_name = self.cleaned_data.get('full_name') 
     return full_name  

views.py:

from django.shortcuts import render 
from django.core.mail import send_mail 
from django.conf import settings 
from app.forms import SignUpForm, ContactForm 
from app.models import ChangeRequests 
from django.views.decorators.csrf import csrf_exempt 
from django.http import HttpResponseRedirect, HttpResponse 


# Create your views here. 

@csrf_exempt 
def home(request): 
    title = "WELCOME GUEST" 


    form = SignUpForm(request.POST) 
    context = { 
     "title": title, 
     "form": form 
    } 

    if form.is_valid():#this cases the form to be saved into the DB I can also have it where if form.is_valid(): form.save() 
     form.save() 
     form_email = form.cleaned_data.get("email") 
     form_message = form.cleaned_data.get("message") 
     form_full_name = form.cleaned_data.get("full_name") 
     form_environment = form.cleaned_data.get("environment") 
     form_what_is_the_change = form.cleaned_data.get("what_is_the_change") 
     form_change_date_and_time = form.cleaned_data.get("change_date_and_time") 
     #form_status = form.cleaned_data.get("status") 
     subject = "Request for a change" 
     from_email = settings.EMAIL_HOST_USER + "@company.com" 
     to_email = ["[email protected]"] 
     contact_message = """ 
User: %s 

Email: %s 

Requesting the following change: (%s) 

Environment affected: (%s) 

Date and time of the change: %s 
Admin approvals and review >>>>> http://myserver/admin and use your admin login credentials. 
     """%(form_full_name, form_email, form_what_is_the_change, form_environment, form_change_date_and_time) 

     send_mail(subject, contact_message, from_email, to_email, fail_silently=False) 
     return HttpResponseRedirect('/submitted') 

     context = { 
      "title": "Thank you" 
     } 
    return render(request, 'home.html', context) 

Antwort

0

Ich kann nicht sehen, wo Sie irgendeine Art von li enthalten nk in dieser E-Mail, aber Sie können sicherlich die reversing admin urls Funktionalität verwenden, um einen Link direkt zu Ihrem Inhalt zu erstellen.

from django.core.urlresolvers import reverse 

... 

if form.is_valid(): 
    item = form.save() 
    link = reverse('admin:app_changerequests_change', args=(item.id,)) 
    url = "https://ADDRESS_OF_MY_SITE{}".format(link) 

und Sie können diesen url Wert in Ihrer E-Mail enthalten.

+0

danke @Daniel Ich bekomme den Fehler unten, wenn ich Ihren Code in meine view.py 'lokale Variable 'Element' vor der Zuweisung verwiesen ' – FrankBud

+0

Sie würde das nicht mit meinem Code bekommen. Vielleicht haben Sie ein Einzugsproblem? –

+0

Dank @Daniel fixiere ich meine Einrückung und es hat funktioniert. – FrankBud

0

Wie Ihr Modell dafür ist es das gleiche. Also, du kannst ID oder PK übergeben.

Für Ihr Wissen, Django ist immer id Feld in jedem Modell für Eindeutigkeit hinzufügen, und pk bedeutet Ihr Primärschlüsselfeld. So können Sie dem Primärschlüssel ein beliebiges Feld zuweisen (standardmäßig ist es dem Feld id zugewiesen). Sie haben also einmal zugewiesen, dass der Primärschlüssel für jedes Feld wahr ist. dann, wenn Sie pk anrufen. Es gibt den Wert des Primärschlüsselfeldes zurück.

Hoffentlich wird es für Sie helfen. :)

+0

danke @Naresh Chaudhary Ich habe das versucht, aber es sagte weiter Form haben keine Eigenschaft "ID" ...... Ich muss es falsch gemacht haben. Würdest du mir im Kontext meines obigen Codes sagen, wo und wie die ID oder PK zu verwenden ist? – FrankBud

+0

Ich denke @Daniel Roseman Code, du benutzt. wenn nicht, sag mir, ich werde für dich schreiben. –

0

Sie den richtigen Server-Betreiber Änderung URL für Modellobjekt erhalten können

reverse('admin:app_model_change', args=(model_object.id)) 

Senden Sie die URL in Ihre E-Mail verwendet wird.