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)
danke @Daniel Ich bekomme den Fehler unten, wenn ich Ihren Code in meine view.py 'lokale Variable 'Element' vor der Zuweisung verwiesen ' – FrankBud
Sie würde das nicht mit meinem Code bekommen. Vielleicht haben Sie ein Einzugsproblem? –
Dank @Daniel fixiere ich meine Einrückung und es hat funktioniert. – FrankBud