2016-04-01 6 views
1

У меня есть модель, которая сохраняет запрос об изменении и уведомляет администраторов по электронной почте, если создается новая запись. Администратор получает и мягкое уведомление по ссылке, чтобы просмотреть запись 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) 

ответ

0

Я не вижу, где вы включаете любые лили nk в этом письме, но вы можете использовать функциональность reversing admin urls, чтобы создать ссылку прямо на ваш контент.

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) 

и вы можете включить эту url значение в вашей электронной почте.

+0

спасибо @Daniel Я получаю ошибку ниже, когда я помещаю ваш код в свой view.py «локальная переменная» item «ссылка перед назначением» – FrankBud

+0

Вы не получили бы это с моим кодом. Возможно, у вас проблема с отступом? –

+0

Спасибо @ Даниэль Я исправляю свой отступ, и это сработало. – FrankBud

0

Как и ваша модель для этого, она такая же. Таким образом, вы можете передать id или pk.

Для вашего удобства, Django всегда добавляет id поле в каждой модели для уникальности, а pk означает ваше основное поле ключа. поэтому вы можете назначить любое поле первичному ключу (по умолчанию ему присвоено поле id). поэтому вы когда-то назначили первичный ключ, это верно для любого одного поля. то, когда вы звоните pk. Он вернет значение поля первичного ключа.

Надеюсь, это поможет вам. :)

+0

спасибо @Naresh Chaudhary Я пробовал это, но он продолжал говорить, что форма не имеет атрибута «id» ... Я, должно быть, делал это неправильно. Не могли бы вы рассказать мне - в контексте моего кода выше - где и как использовать id или pk? – FrankBud

+0

Я думаю @ Daniel Roseman код, вы использовали. если не скажешь, я напишу для тебя. –

0

вы можете получить право администратора изменить URL для модели объекта с помощью

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

Отправить URL-адрес в вашей электронной почте.

Смежные вопросы