У меня есть модель, которая сохраняет запрос об изменении и уведомляет администраторов по электронной почте, если создается новая запись. Администратор получает и мягкое уведомление по ссылке, чтобы просмотреть запись http://mydjango/admin, и они входят в систему, чтобы просмотреть и одобрить или отклонить запрос. Администраторы хотели бы, чтобы ссылка выше передавала их непосредственно на запись, а не на сайт администратора, и чтобы они просматривали список записей, чтобы найти последнюю. Я должен сказать, что я супер новичок в django и хотел бы посмотреть, возможно ли это. Я заметил, что если я перейду к записи и нажму на нее, ссылка на мой браузер будет иметь уникальный номер для примера: http://127.0.0.1:8000/admin/app/changerequests/61/change/Уникальный идентификатор записи Django MySQL или pk
есть что-то 61, которое меняется для каждой записи. Поэтому я подумал, может быть, включить этот «идентификатор» только что созданной записи в электронном письме, которое выходит администратору.
ее моя модель, форма, вид, администратор
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)
спасибо @Daniel Я получаю ошибку ниже, когда я помещаю ваш код в свой view.py «локальная переменная» item «ссылка перед назначением» – FrankBud
Вы не получили бы это с моим кодом. Возможно, у вас проблема с отступом? –
Спасибо @ Даниэль Я исправляю свой отступ, и это сработало. – FrankBud