Estoy creando un proyecto donde:
formularios.py
class InputForm(forms.Form): user_input = forms.CharField(max_length=50, label="") random_url = forms.CharField(initial=uuid.uuid4().hex[:6].upper())modelos.py
class AddToDatabase(models.Model): user_input = models.CharField(max_length=50, unique=True) random_url = models.CharField(max_length=10, unique=True)vistas.py
def Home(request): if request.method == 'POST': form = InputForm(request.POST) if form.is_valid(): user_input = request.POST.get('user_input', '') random_url = request.POST.get('random_url', '') data = AddToDatabase(user_input=user_input, random_url=random_url) data.save() return render(request, 'index.html', {'form':form}) else: form = InputForm() return render(request, 'index.html', {'form':form})índice.html
<form action="" method="POST"> {{form}} {% csrf_token %} <input type="submit"> </form>Soy nuevo en Python / Django, lo que probablemente sea obvio. El código anterior permite a los usuarios enviar una entrada que se agrega con éxito a la base de datos. También genera 6 caracteres aleatorios y los agrega a la base de datos.
El problema es que no sé cómo convertir ese código aleatorio en una URL y redirigir al usuario allí después de enviar el formulario.
He probado un par de métodos hasta ahora, como agregar action="{{ random_url }}" al formulario index.html , así como agregar url(r'(?P<random_url>\d+)', views.Home, name='home') a urls.py
Recomendaría usar algo como Hashids para sus URL en lugar de uuid.uuid4()[:6] , pero creo que su problema inmediato está en urls.py :
url(r'(?P<random_url>\d+)', views.Home, name='home') Aquí su expresión regular para random_url es \d+ . \d+ coincide con uno o más dígitos decimales , pero los valores generados por uuid.uuid()[:6] no son decimales. Creo que \w encajará mejor.
El otro problema es que views.Home no acepta la "URL aleatoria", por lo que nunca sabe cuál mostrar. Dale un segundo argumento:
def Home(request, random_url=None): y luego use random_url dentro de Home para cargar la página correcta de la base de datos. Sospecho que esto debería suceder en una nueva función de vista, pero no tengo claro qué representa cada página, por lo que no puedo recomendarle un buen nombre.
modelos.py
import uuid class AddToDatabase(models.Model): user_input = models.CharField(max_length=50, unique=True) random_url = models.UUIDField(default=uuid.uuid4)formularios.py
from .models import AddToDatabase class InputForm(forms.ModelForm): class Meta: model = AddToDatabase fields = ["user_input"]vistas.py
from django.shortcuts import redirect def Home(request): form = InputForm() if request.method == 'POST': form = InputForm(request.POST) if form.is_valid(): form_instance = form.save(commit=False) form_instance.save() return redirect("form_detail", random_url=form_instance.random_url) return render(request, 'index.html', {'form':form}) def form_detail(request, random_url): template = "form_detail.html" context = {} form_detail = get_object_or_404(AddToDatabase, random_url=random_url) context["form_detail"] = form_detail return render(request, template, context)urls.py
from . import views urlpatterns = [ url(r'^home/$' views.Home, name="home"), url(r'^form-detail/(?P<random_url>[-\w]+)/$', views.form_detail, name="form_detail") ]en la plantilla form_detail.html
<div> <p> User Input : {{ form_detail.user_input }}</P> </div>