'Save user input which is a string as object in db
I am trying to implement a registration key in the registration form which the user has to input to be able to create an account. In my users model, I have a key field which is the foreign key of the Key model. The relation looks like this
class RegistrationKey(models.Model):
key = models.CharField(max_length=30)
class User(AbstractUser):
...
key = models.ForeignKey(RegistrationKey, on_delete=models.CASCADE, null=True, blank=True)
I have tried to validate the input like this in the view
def registerPage(request):
form = MyUserCreationForm()
if request.method == 'POST':
form = MyUserCreationForm(request.POST)
key_input = request.POST.get('key')
...
if RegistrationKey.objects.filter(key_input=key).exists() and form.is_valid():
user = form.save(commit=False)
user.key.add('key_input')
...
user.save()
In my form have I set the key field as a CharField as I can not display the keys for the user. This means that the user inputs a string but django needs an instance to be able to save it to the database. I don't know how to implement this. Is there any way to convert a string to an instance or is there a better way to query the the database, to check and see if the input is a valid key?
Edit
This is the error when I try to add in the key 'Admin' which is in the database. "Cannot assign "'Admin'": "User.key" must be a "RegistrationKey" instance."
Solution 1:[1]
def registerPage(request):
form = MyUserCreationForm()
if request.method == 'POST':
form = MyUserCreationForm(request.POST)
if form.is_valid():
key_input = form.cleaned_data['key_input']
registration_key_object = RegistrationKey.objects.get(
key=key_input)
user.key = registration_key_object
user.save()
...
if you have a string(your_key) and you need object(RegistrationKey)
simply get it
reigstration_key_object = RegistrationKey.objects.get(key=your_key)
Solution 2:[2]
There are multiple approach to implement this
Approach 1:
def registerPage(request):
form = MyUserCreationForm()
if request.method == 'POST':
form = MyUserCreationForm(request.POST)
key_input = request.POST.get('key')
registration_key = RegistrationKey.objects.filter(key_input=key_input)
if Rregistration_key.exists() and form.is_valid():
registration_key = registration_key.first()
user = form.save(commit=False)
user.key = registration_key
user.save()
Approach 2:
def registerPage(request):
form = MyUserCreationForm()
if request.method == 'POST':
form = MyUserCreationForm(request.POST)
key_input = request.POST.get('key')
if form.is_valid():
try:
registration_key = RegistrationKey.objects.get(key_input=key_input)
except RegistrationKey.DoesNotExist:
pass
# raise your exception here
user = form.save(commit=False)
user.key = registration_key
user.save()
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | oruchkin |
| Solution 2 | Zilay |
